aop总结笔记

=总结=
1).@Import(AspectJAutoProxyRegistrar.class) 利用@EnableAspectJAutoProxy给容器创建注册一个 internalAutoProxyCreator=AnnotationAwareAspectJAutoProxyCreator.class 注解装配自动代理创建器 名为
2).AnnotationAwareAspectJAutoProxyCreator父类 -> AspectJAwareAdvisorAutoProxyCreator -> AbstractAdvisorAutoProxyCreator -> AbstractAutoProxyCreator -> ProxyProcessorSupport->
发现有 SmartInstantiationAwareBeanPostProcessor 和 BeanFactoryAware 关注到后置处理器(在bean初始化完成前后) 和 自动装配BeanFactoryAware
3). AbstractAutoProxyCreator.setBeanFactory(BeanFactory beanFactory) AbstractAutoProxyCreator.postProcessBeforeInstantiation
AbstractAdvisorAutoProxyCreator重写了setBeanFactory
在注册创建后置处理器中registerBeanPostProcessors(beanFactory) 在初始化方法中initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) 调用了Aware的setBeanFactory方法 创建了aspectJAdvisorFactory和aspectJAdvisorsBuilder
以上是创建和注册===
1.finishBeanFactoryInitialization(beanFactory);
2.Object bean = resolveBeforeInstantiation(beanName, mbdToUse); resolve解析
【BeanPostProcessor是bean初始化前后执行】
【InstantiationAwareBeanPostProcessor是在创建bean实例之前尝试用后置处理器返回对象】 即AnnotationAwareAspectJAutoProxyCreator在创建bean实例之前 在 applyBeanPostProcessorsBeforeInstantiation(targetType, beanName)中
3.执行AbstractAutoProxyCreator的postProcessBeforeInstantiation()方法 – 创建对象
1.判断当前bean是否在advisedBeans中 advisedBeans:所有增强的bean
2.是否是基础类型 (实现了Advice, Pointcut, Advisor, AopInfrastructureBean接口 是否是切面) 或者 是否需要跳过(shouldSkip)
3.创建对象
4.执行AbstractAutoProxyCreator的postProcessAfterInitialization()方法 – 创建代理对象
1.判断是否是切面或者需要跳过
2.获取所有增强器找到当前bean的能使用的增强器并且排序 Object[]specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);
3.advisedBeans做标记已经被增强了
4.创建代理对象
1.获取所有增强器
2.用代理工厂创建对象
3.为组件创建代理对象 (JdkDynamicAopProxy jdk动态代理 还是 ObjenesisCglibAopProxy cglib动态代理)
5.返回创建好的代理对象 以后容器获取到的都是代理对象
=============以下为 目标方法执行(cglib)
1.容器中保存了代理对象 对象里面保存了详细信息(增强器,目标对象)
2.CglibAopProxy.intercept();拦截目标方法执行
1.获取拦截链 List chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass); 每一个advisor都被包装成拦截器
1.创建一个长度advisors.length的list
2.遍历所有增强器将其转换为MethodInterceptor (如果不是MethodInterceptor的advisor可以遍历所有适配器转换成MethodInterceptor) *适配器模式
2.如果没有拦截器链则直接执行目标方法 如果有则把需要的信息(目标方法 目标对象 拦截器链 传入并创建一个CglibMethodInvocation()对象调用.proceed()方法; 返回一个retVal)
3.拦截器链的触发过程 ReflectiveMethodInvocation.proceed();
1.如果没有拦截器 或者执行到最后一个拦截器时 执行目标方法;
2.索引记录 每次执行都自增一次
3.顺序 ExposeInvocationInterceptor -> AspectJAfterThrowingAdvice ->AfterReturningAdviceInterceptor -> AspectJAfterAdvice -> MethodBeforeAdviceInterceptor
按顺序执行完后返回 会按照逆序执行每个方法的finally中的方法
即(MethodBeforeAdviceInterceptor会调用前置通知方法before() 执行完后返回到上一个methodInvocation 即触发最后一个拦截器执行目标方法 AspectJAfterAdvice执行后置方法
AfterReturningAdviceInterceptor执行返回通知 如果有异常AspectJAfterThrowingAdvice执行异常通知
总结:链式获取每一个拦截器,拦截器执行invoke方法,等待下一个拦截器执行完返回以后再来执行 通过这种方式来保证方法的执行顺序
1.@EnableAspectJAutoProxy开启AOP功能
2.@EnableAspectJAutoProxy 会给容器中注册一个组件AnnotationAwareAspectJAutoProxyCreator
3.AnnotationAwareAspectJAutoProxyCreator是一个后置处理器 (InstantiationAwareBeanPostProcessor是在创建bean实例之前尝试用后置处理器返回对象)
4.组件创建完 会判断组件是否需要增强 是:切面的通知方法 包装成增强器(advisor);给业务创建一个代理对象
5.代理对象执行目标方法时得到目标方法的拦截器链(通过增强器转换)
6.通过排拦截器机制依次进入每一个拦截器执行 前置通知->目标方法->后置通知->返回通知/异常通知

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值