springAop源码流程
2021-11-13 09:10:54 1 举报
springAOP 从开启AOP到创建调用源码详细流程
作者其他创作
大纲/内容
开启Spring AOP
将每个通知方法解析成Advisor。
befroe
order
调用ConfigurationClassPostProcessor的bean工厂的后置处理器将AnnotationAwareAspectJAutoProxyCreator注册成bean定义
befroe,执行前置通知
finishBeanFactoryInitialization
invokeBeanFactoryPostProcessors
after
放入一级缓存Singleton
回调执行after
getAdvisorMethods找出所有通知方法
getAdvicesAndAdvisorsForBean进行pointcut和当前bean的方法进行匹配。返回匹配到的通知集合
调用动态代理方法
invoke
getAdvisor
proceed()
sort
advisors
afterRetruning
sortAdvisors()
advice
wrapIfNecessary
registerBeanDefinitions
public void sayAfterAspect(JoinPoint joinPoint)
@Component@Aspectpublic class TeacherAspect { @Before(\"execution(public * com.pojo.*.*(..))\") public void sayBeforeAspect(JoinPoint joinPoint){ Object[] args = joinPoint.getArgs(); System.out.println(\"before:\"+ args[0] + \" say be quiet\"); } @After(\"execution(public * com.pojo.*.*(..))\") public void sayAfterAspect(JoinPoint joinPoint){ Object[] args = joinPoint.getArgs(); System.out.println(\"after: \"+args[0]+\" class is over\"); } @AfterThrowing(value = \"execution(public * com.pojo.*.*(..))\
通知调用
创建AnnotationAwareAspectJAutoProxyCreator 后置处理器,注册到bean的后置处理器中。
从所有bean定义中找出带有@Aspect的注解的bean定义
\"execution(public * com.pojo.*.*(..))\
execution(public * com.pojo.*.*(..))
Advisor
回调执行afterRetruning
advisors中的通知进行排序
registerBeanPostProcessors
创建bean之前第一次调用bean的后置处理器时,进行切面解析。也就是调用AbstractAutoProxyCreator中的postProcessBeforeInstantiation方法
afterthrowing
createProxy
postProcessBeforeInstantiation
将通知封装为advisor
proceed()进行递归调用通知
bean初始化完成后,调用bean的后置处理器AbstractAutoProxyCreator中的postProcessAfterInitialization方法创建动态代理
public * com.pojo.*.*(..))\
advisorsCache
porxyBean
public void sayBeforeAspect(JoinPoint joinPoint)
@Import(AspectJAutoProxyRegistrar.class)public @interface EnableAspectJAutoProxy
@EnableAspectJAutoProxy
回调使用try/catch
buildAspectJAdvisors
beanName
findCandidateAdvisors()从缓存中获取所有的advisor
动态代理创建完成后放入一级缓存中Singleton
当匹配到至少一个通知时进行动态代理创建createProxy()
将通知和代理对象封装成MethodInvocation
pointcut
0 条评论
回复 删除
下一页