Spring AOP原理
2021-12-08 22:40:41 0 举报
Spring源码之 Spring AOP原理
作者其他创作
大纲/内容
initBeanFactory创建BeanFactoryAspectJAdvisorsBuilderAdapter,ReflectiveAspectJAdvisorFactory对象,用于保存和产生功能增强器
getAdvisors方法获取所有增强器
MethodInterceptor Spring家的方法拦截器
mi.proceed();继续向下
invoke(this)
挨个判断所有增强器的正则是否匹配该类中的方法
MethodInterceptor(Cglib家的回调接口)
正常返回链
如果有增强器就为这个对象创建代理对象
0==1
invoke(this[前面new出的啥都有的mi])使用ThreadLocal保存
applyBeanPostProcessorsBeforeInstantiation尝试返回一个代理对象
return
getAdvisorMethods()通过反射获取该类中的所有方法,并添加到集合中
mi
finishBeanFactoryInitialization(beanFactory);
直接取缓存中拿
1.是否为切面2.是否跳过2.1获取到所有切面的增强器2.2看是否为特殊类3.前置的这个过程都没有干什么事
后续创建其他BeanPostProcessor后置处理器对象
创建完成,执行初始化环节lnitizilaizeBean
ExposeInvocationInterceptor线程共享数据的
getPointcut获取切入点
getAdvisor()
AOP后置拦截AspectJAwareAdvisorAutoProxyCreator.postProcessBeforeInstantiation
shouldSkip判断是否应该跳过,判断该类是否为要增强的Bean
1==2
AnnotationAwareAspectJAutoProxyCreator运行流程第一次运行的时候就把切面信息和增强器缓存起来了
MethodBeforeAdviceInterceptor前置通知拦截器
HelloService 回调DynamicAdvisedInterceptor(advice)
正常: 前置通知==》目标方法==》返回通知==》后置通知异常: 前置通知==》目标方法===》异常通知==》后置通知
调用AspectJAwareAdvisorAutoProxyCreator的applyBeanPostProcessorsBeforeInstantiation方法
。。。。
invokeJoinpoint();执行连接点(执行sayhello()方法)
代理对象中保存了很多东西
getBean(HelloService)
运行流程 链式执行
AnnotationAwareAspectJAutoProxyCreator类是一个BeanPostProcessor
别人第一个人创建对象
catch (Throwable ex) {\t\t\tif(shouldInvokeOnThrowing(ex)) {\t\t\t\tinvokeAdviceMethod()}\t\t\tthrow ex;}
AOP在创建其他组件环节
AnnotationAwareAspectJAutoProxyCreator处理器创建完对象了
BeanPostProcessor.postProcessAfterInitialization()Aop判断此对象是否有增强方法(有切面切入它)
AspectJAfterThrowingAdvice异常拦截器
isInfrastructureClass方法判断retVal = Advice.class.isAssignableFrom(beanClass) || Pointcut.class.isAssignableFrom(beanClass) || Advisor.class.isAssignableFrom(beanClass) || AopInfrastructureBean.class.isAssignableFrom(beanClass);
包装为拦截器
2==3
Object retVal = mi.proceed();继续往下拿返回值
invokeBeanDefinitionRegistryPostProcessors()执行ConfigurationClassPostProcessor后置处理器解析配置文件
invokeAwareMethods()执行Aware方法
不需要增强
调用方法sayHello()
异常返回链
将获取到的所有增强器添加到缓存中advisorsCache
buildAspectJAdvisors方法拿到所有的Bean,循环遍历所有Bean是否标注@Aspect注解
当前索引已经等于拦截器总数减1
registerBeanPostProcessors()创建AnnotationAwareAspectJAutoProxyCreator对象
这是拦截器的核心 拦截器封装了增强器
AfterReturningAdviceInterceptor返回通知拦截器
return mi.proceed();继续往下执行
AbstractAspectJAdvisorFactory.findAspectJAnnotationOnMethod(candidateAdviceMethod);获取方法上的注解
AspectJAfterAdvice后置通知拦截器
finally {invokeAdviceMethod();}
InstantiationModelAwarePointcutAdvisorImpl类,每一个InstantiationModelAwarePointcutAdvisorImpl都是Advisor
initializeBean初始化Bean
AOP定义阶段
this.advice.afterReturning执行返回通知
HelloService创建对象
3==4
遍历ASPECTJ_ANNOTATION_CLASSES判断
return mi.proceed();
invokeBeanFactoryPostProcessors()首先来到容器刷新12大步的BeanFactoryPostProcessor刷新流程
在@EnableAspectJAutoProxy里面的AspectJAutoProxyRegistrar类里面打断点
构建增强器buildAspectJAdvisors(第一次进来它不知道是切面)
advice.before执行前置通知
4
收藏
0 条评论
下一页