Spring AOP
2022-08-27 01:07:31 0 举报
AI智能生成
Spring AOP 源码解析
作者其他创作
大纲/内容
proxyFactory.getProxy()
创建 AopProxy
如果进行优化 或者 设置直接代理目标类 或者 没有添加代理接口
被代理的类是接口 或 被代理的类是jdk生成的代理类
使用jdk动态代理 JdkDynamicAopProxy
使用cglib 动态代理 ObjenesisCglibAopProxy
否则直接使用jdk动态代理 JdkDynamicAopProxy
生成代理对象
jdk 动态代理
代理对象方法执行
如果接口中未定义 equals() hashCode() 不执行代理逻辑
如果 exposeProxy 是 true,将代理对象放入 ThreadLocal<Object> currentProxy
根据方法筛选出匹配的 Advice,并适配成 Interceptor
遍历所有的 Advisors
先匹配类再匹配方法
匹配成功将 advisor 封装成 MethodInterceptor
适配器模式
MethodBeforeAdviceAdapter
AfterReturningAdviceAdapter
ThrowsAdviceAdapter
MethodBeforeAdviceAdapter
AfterReturningAdviceAdapter
ThrowsAdviceAdapter
如果 runTime 为 true,将 MethodInterceptor 封装为 InterceptorAndDynamicMethodMatcher
runTime 为 true时,执行方法时会进行参数匹配
runTime 为 true时,执行方法时会进行参数匹配
没有匹配的 advice,直接执行连接点被代理逻辑
匹配到 advice,则执行代理逻辑
此时的顺序为 add 的顺序
cglib 动态代理
获取和被代理类匹配的 Advisor (getCallbacks())
@EnableAspectJAutoProxy
注入 AspectJAutoProxyRegistrar
将 AnnotationAwareAspectJAutoProxyCreator 注册一个 Bean
初始化后
判断当前 Bean 是否需要 Aop
根据 Bean 获取匹配的 advisor
找到所有的 Advisor
找到 Advisor 类型的 Bean 对象
如果为空则解析切面
拿到所有 Bean,过滤出被 @Aspect 注解的Bean
根据 Bean 得到切面注解信息 AspectMetadata
将切面 Bean 封装为 MetadataAwareAspectInstanceFactory
利用 AspectJAdvisorFactory 解析切面类得到 advisor
获取切面类中没有加 @PointCut 的方法
将方法封装为 advisor
拿到当前方法对应的 PointCut 对象
封装为 InstantiationModelAwarePointcutAdvisorImpl
获取 advice
拿到方法上的注解信息
@Around
AspectJAroundAdvice
@Before
AspectJMethodBeforeAdvice
@After
AspectJAfterAdvice
@AfterReturning
AspectJAfterReturningAdvice
@AfterThrowing
AspectJAfterThrowingAdvice
进行筛选
先匹配类,再匹配方法(有一个方法匹配即可)
按 ordered 接口、@Order 对 Advisor 进行排序
如果匹配到 advisor则创建代理对象
将 EnableAspectJAutoProxy 的属性值加入AnnotationAwareAspectJAutoProxyCreator
0 条评论
下一页