Spring的注解 了解一些些注解流程1

总结
1)、@EnableAspectJAutoProxy开启AOP功能
2)、@EnableAspectJAutoProxy会给容器中注册一个组件AnnotationAwareAspectJAutoProxyCreator
3)、AnnotationAwareAspectJAutoProxyCreator是一个后置处理器
4)、容器创建流程
(1)、refersh()刷新容器,有一步是registerBeanPostProcessors,注册后置处理器,创建AnnotationAwareAspectJAutoProxyCreator对象。
(2)、refersh中有一步是finishBeanFactoryInitialization,初始化剩下的单实例bean
1)、创建业务逻辑组件和切面组件
2)、AnnotationAwareAspectJAutoProxyCreator拦截组件的创建过程
3)、组件完成之后,判断组件是否需要增强
是:切面的通知方法包装成增强器(Advisor),给业务逻辑组件创建一个代理对象(cglib)
5)、执行目标方法
(1)、代理对象执行目标方法
(2)、CglibAopProxy.intercept()
1)、得到目标方法的拦截器链(增强器Advisor包装成拦截器MethodInterceptor)
2)、利用拦截器的链式机制,依次进入每一个拦截器进行执行
3)、效果:
正常执行:前置通知->目标方法->后置通知->返回通知
出现异常:前置通知->目标方法->后置通知->异常通知

1、@EnableAspectJAutoProxy
@EnableAspectJAutoProxy中@Import(AspectJAutoProxyRegistrar.class),给容器中导入了AspectJAutoProxyRegistrar。自定义给容器中注册bean,给容器中注册一个AnnotationAwareAspectJAutoProxyCreator。

2、AnnotationAwareAspectJAutoProxyCreator
AnnotationAwareAspectJAutoProxyCreator
->AspectJAwareAdvisorAutoProxyCreator
->AbstractAdvisorAutoProxyCreator
->AbstractAutoProxyCreator
implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware
关注后置处理器(在bean初始化前后完成事情)、自动装配BeanFactory

3、setBeanFactory
AbstractAutoProxyCreator. setBeanFactory
AbstractAutoProxyCreator有后置处理器的逻辑

AbstractAdvisorAutoProxyCreator.setBeanFactory()->initBeanFactory()

AspectJAwareAdvisorAutoProxyCreator

AnnotationAwareAspectJAutoProxyCreator.initBeanFactory
流程:
1)、传入配置类,注册ioc容器
2)、注册配置类,调用refersh()刷新容器
3)、注册bean的后置处理器方便拦截bean的创建
1)、先获取ioc容器已经定义了的需要创建对象的所有BeanPostProcessor
2)、给容器中加别的BeanPostProcessor
3)、优先注册实现了PriorityOrdered的BeanPostProcessor
4)、再注册实现了Ordered的BeanPostProcessor
5)、注册没实现优先级接口的BeanPostProcessor
6)、注册BeanPostProcessor实际上就是创建BeanPostProcessor对象保存在容器中
创建internalAutoProxyCreator的BeanPostProcessor【AnnotationAwareAspectJAutoProxyCreator】
1)、创建bean的实例
2)、populateBean:给bean的各种属性赋值
3)、initializeBean:初始化bean
1)、invokeAwareMethods():处理Aware接口的方法回调
2)、applyBeanPostProcessorBeforeInitialization():应用后置处理器的postProcessorBeforeInitialization
3)、invokeInitMethods():执行自定义的初始化方法
4)、applyBeanPostProcessorAfterInitialization():执行后置处理器的PostProcessorAfterInitialization
4)、BeanPostProcessor(AnnotationAwareAspectJAutoProxyCreator)创建成功
7)、把BeanPostProcessor注册到BeanFactory中
( 以上是创建和注册AnnotationAwareAspectJAutoProxyCreator的过程)

4)、finishBeanFactoryInitialization(BeanFactory):完成BeanFactory的初始化操作:创建剩下的单实例bean
1)、遍历获取容器中所有的bean,依次创建对象getBean(beanName)
getBean->doGetBean()->getSingleton()
2)、创建bean
【AnnotationAwareAspectJAutoProxyCreator会在创建之前有一个拦截,因为是InitializationAwareBeanProcessor,在创建之前尝试调用postProcessorBeforeInitialization】
1)、先从缓存中获取bean,能获取说明之前创建过,不能获取就创建bean
2)、createBean():创建Bean:AnnotationAwareAspectJAutoProxyCreator会在任何bean创建之前先尝试返回bean的实例
【BeanPostProcessor是在Bean对象创建完成初始化前后调用的】
【InitializationAwareBeanProcessor是在创建Bean实例之前先尝试用后置处理器返回对象的】
1)、resolveBeforeInitialization:解析BeforeInitialization。希望后置处理器能返回一个代理对象,如果能返回代理对象就使用,如果不能就继续
1)、后置处理器先尝试返回对象:拿到所有的后置处理器,如果是InitializationAwareBeanProcessor,就执行postProcessorBeforeInitialization
2)、doCreateBean:真正的创建一个bean实例,和3.6的流程一样

AnnotationAwareAspectJAutoProxyCreator.InitializationAwareBeanProcessor作用:在每一个bean创建之前,调用postProcessorBeforeInitialization
1)、关于MathCalculator和LogAspect的创建
(1)、判断当前bean是否在AdvisedBeans中(保存了所有需要强化bean)
(2)、判断当前bean是否是基础类型的Advise、Pointcut、Advisor、AopInfrastructureBean,或者是否是切面(@Aspect)
(3)、是否需要跳过
(1)获取候选的增强器(切面里的通知方法),每一个封装的通知里的增强器是InitializationModelAwarePointcutAdvisor。判断每一个增强器是否是AspectJPointcutAdvisor类型的。
(2)永远返回false
2)、创建对象
PostProcessAfterInitialization
(1)、获取当前bean的所有增强器(通知方法),找到候选的的增强器(找到哪些通知方法是需要切入当前bean方法的)。获取到能在当前bean使用的增强器。给增强器排序
(2)、保存当前bean在AdvisedBeans中
(3)、如果当前bean需要增强,则创建当前bean的代理。Spring自动决定是创建jdk的动态代理还是cglib的动态代理
(4)、给容器中返回当前组件使用cglib增强了的代理对象
(5)、以后容器中获取到的就是这个组件的代理对象,执行目标方法的时候,代理对象就会执行通知方法的流程
3)、目标方法执行
容器中保存了自建的代理对象(cglib增强后的对象),这个对象里面保存了详细信息(比如增强器,目标对象)
(1)、CglibAopProxy.intercept(),拦截目标方法执行
(2)、根据ProxyFactory对象获取将要执行的目标方法的拦截器链
(3)、如果没有拦截器链,直接执行目标方法
(拦截器链就是每一个通知方法又被包装为方法拦截器,利用MethodInterceptor机制)
(4)、如果有拦截器,把需要执行的目标对象、目标方法、拦截器链等信息传入创建一个CglibMethodInvocation对象
(5)、拦截器链的触发过程
1)、如果没有拦截器执行目标方法,或者拦截器的索引和拦截器数组-1一样(指定到了到最后一个拦截器)
2)、链式获取每一个拦截器,拦截器执行invoke方法,每一个拦截器等待执行下一个拦截器执行完成之后返回以后再来执行。拦截器的机制保证通知方法与目标方法的执行顺序。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值