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