-
代理模式: 接口 + 真正实现类 + 代理类
- 真正实现类和代理类都需要实现接口
- 实例化时使用代理类进行实例化
- Spring AOP的作用就是生成一个代理类来替换真正的实现类来对外提供服务
-
Spring中代理的实现模式:
- Spring AOP中使用 @EnableAspectJAutoProxy注解,将BeanPostProcessor的子类AnnotationAwareAspectJAutoProxyCreator.class注入到容器中,然后在Bean生命周期中的后置处理器里判断切面的情况进行生成代理增强器,并且利用动态代理机制生成代理类
- 真正实现类的逻辑包含在getBean() 方法中
-
getBean() 方法返回一个Proxy代理类实例
- Proxy代理类实例时Spring通过JDK动态代理或者CGLIB代理动态生成的
- 因为Spring AOP中要通过getBean() 方法查找和实例化容器中的Bean, 所以Spring AOP只能作用于Spring容器中的Bean, 无法作用于不是使用Spring IOC容器管理的对象
-
总结:
- Spring AOP的核心是代理创建器AbstractAutoProxyCreator的子类,本质上是一个Bean的后置处理器
- Spring根据配置将相应的代理创建器注册到Spring容器中.如果项目中配置 @EnableAspectJAutoProxy注解 ,Spring就会将AnnotationAwareAspectJAutoProxyCreator注册到Spring容器中
- 因为代理创建器是一个Bean的后置处理器,所以会在Bean的初始化阶段被调用
- 代理创建器会判断当前的Bean是否需要被代理,如果不需要代理就直接将原Bean实例返回.如果需要代理就使用动态代理技术根据当前Bean作为目标类创建一个代理类,并且将横切代码注入到代理类中,然后生成一个代理类的实例并返回,使用这个实例作为Bean的实例
- 如果这个Bean是单例的,那么这个代理对象就会放置到Spring容器的单例池中,这样使用getBean() 时,就可以直接从Spring容器中直接获取这个代理对象
Spring AOP的实现模式
未经允许不得转载:IDEA激活码 » Spring AOP的实现模式