说说你对spring的理解
在传统程序中,当某个角色需要另外一个角色协助时,由调用者来创建被调用者的实例。而在Spring中,创建被调用者的的工作不再由调用者来完成,而由第三方Spring容器来完成,所以称为控制反转,Spring容器创建被调用者的实例,然后注入调用者,所以又称为依赖注入
工作原理
- 工厂类设计模式,实现BeanFactory接口,程序中通常用子类ApplicationContext
- 基于配置
- ioc负责对象的生命周期,创建->初始化->摧毁
- 反射
- 代理
控制反转(ioc)
- 一般我们创建对象都是自己new一个,现在我们只需要交给spring处理,我们不需要关心它怎么去构造的,它就会返回给我们实例
- 集中管理,实现资源的可配置与易管理
- 解耦
依赖注入(DI)
- 依赖注入就是给某些需要自动装配的实例初始化值(默认
单例
) - 通过set注入,property赋值
public void setName(String name) { this.name = name; }
<bean name="c" class="com.how2java.pojo.Category"> <property name="name" value="category 1" /> </bean>
- 构造方法注入
public UserService(UserDao userDao){ this.userDao = userDao; };
<bean id='userDao' class='com.**.UserDao'/> <bean id='userService' class='xxx'> <constructor-arg name='userDao' ref='userDao'/> </bean>
- 注解
@Autowird
@Resource
AOP(切面编程)
- 基于动态代理实现
- 解耦
- 提供声明式事务管理
使用场景
- 所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务
- 所谓的周边功能,比如性能统计,日志,事务管理等等
周边功能
就是所说的切面
大概用法
在service层配置component声明这是一个bean
@Component("s") public class ProductService { public void doSomeService(){ System.out.println("doSomeService"); } }
Aspect声明是一个切面
Component声明是一个bean,由spring管理
Around(value = "execution(* com.how2java.service.ProductService.*(..))")声明对ProductService类所有方法进行切面操作
@Aspect @Component public class LoggerAspect { @Around(value = "execution(* com.how2java.service.ProductService.*(..))") public Object log(ProceedingJoinPoint joinPoint) throws Throwable { System.out.println("start log:" + joinPoint.getSignature().getName()); Object object = joinPoint.proceed(); System.out.println("end log:" + joinPoint.getSignature().getName()); return object; } }
Object object = joinPoint.proceed();表示执行该方便,本例子的话会在执行前执行后都执行方法
https://blog.csdn.net/wolf_goat/article/details/81874862
https://blog.csdn.net/qq_21896123/article/details/79814817