bean是否需要代理
2020-08-29 15:06:25 0 举报
为你推荐
查看更多
是否
作者其他创作
大纲/内容
方法就可能返回代理实例,是一个BeanPostProcessor接口的运用
Before
AbstractAspectJAdvisorFactory
AfterReturning
After
AbstractAutowireCapableBeanFactory.initializeBean
1、获取有@Aspect注解的类中的除了有@PointCut注解的方法,并循环这些方法
advice接口
InstantiationModelAwarePointcutAdvisorImpl
postProcessAfterInitialization
AnnotationAwareAspectJAutoProxyCreator
getAdvisors
findEligibleAdvisors
ReflectiveAspectJAdvisorFactory
instantiateAdvice
找合格的切面,总体逻辑是1、从spring中找所有切面 2、找跟当前bean匹配的切面
1、找到方法上的注解并封装成AspectJAnnotation对象
sortAdvisors
创建切面对象
该方法是为当前bean寻找advisor切面
3、根据有@Aspect注解的类从中获取切面
wrapIfNecessary
判断实例化完成的bean是否需要代理的条件其实就是一个找切面的过程,如果当前bean能找到对应的切面则spring就会返回该bean的代理对象,AOP程序的入口肯定是在bean实例化完成以后。
AfterThrowing
getPointcut
2
2、判断Class是否有@Aspect注解,有@Aspect注解的类就可能有切面
getAdvice
根据注解类型创建不同的Advice对象
AspectJAroundAdvice
applyBeanPostProcessorsAfterInitialization
AspectJAfterAdvice
buildAspectJAdvisors
findCandidateAdvisors
MethodInterceptor接口
AspectJAfterReturningAdvice
Around
MethodBeforeAdvice接口
AspectJAfterThrowingAdvice
2、根据注解类型创建不同的Advice对象
BeanPostProcessor
2、创建AspectJExpressionPointcut对象,并把AspectJAnnotation中的表达式设置进去
getAdvicesAndAdvisorsForBean
BeanFactoryAspectJAdvisorsBuilder
getAdvisor
前面找到了spring中的所有的切面了,现在这个方法就是找到能够作用在当前bean的切面,就是某些切面的pointCut对象包含了该bean的话就是作用在该bean的切面,一个模糊的match过程,不要求深究
findAdvisorsThatCanApply
1、从spring中获取所有的beanDefinition的名称,并获取每一个bean对应的Class对象,循环
1、获取方法上面的注解,并封装成AspectJAnnotation对象
3
AfterReturningAdvice
findAspectJAnnotationOnMethod
获取pointCut对象
AspectJMethodBeforeAdvice
对作用在该bean上的切面进行排序
1
0 条评论
回复 删除
下一页