spring-aop 流程图
2024-03-25 20:27:49 6 举报
Spring-AOP是一种面向切面编程(AOP)的实现,用于在Spring框架中引入横切关注点。其流程图主要包括以下几个关键环节:首先,定义切面(Aspect),切面中包含切点(Pointcut)和通知(Advice)。切点是对目标对象中方法的拦截规则定义,通知则是在切点匹配的方法执行前后要执行的额外代码。然后,将切面应用到目标对象(Target Object)上,可以通过XML配置文件或注解方式进行应用。最后,Spring-AOP在运行时根据切点规则拦截目标对象的方法调用,并在符合条件的情况下执行相应的通知,从而实现横切关注点的注入。
作者其他创作
大纲/内容
先对aspect进行排序(通过javax.annotation.Priority,Order设置),然后按照advice排序(一个aspect内)。
会按照Around, Before,After, AfterReturning, AfterThrowing排列再按照名称排列ReflectiveAspectJAdvisorFactory#adviceMethodComparator
当exposeProxy为true是,则通过AopContext.setCurrentProxy(proxy);设置当前代理到ThreadLocale中
AopUtils.findAdvisorsThatCanApply通过缓存获取所有advisors一顿matches
在实例化前调用全局第一次调用时会解析切面,以及事务注解解析
CglibAopProxy#getProxy
这时候调用都是有缓存的
根据不同的注解生成不同的advice@Around,@Before,@After,@AfterReturning,@AfterThrowing
DefaultAopProxyFactory#createAopProxy觉得使用那种方式实现代理
BeanFactoryAdvisorRetrievalHelper#findAdvisorBeans
执行调用链,执行完后调用被代理类方法
@EnableAspectJAutoProxy开启 Aop
JdkDynamicAopProxy#getProxy
AbstractAutoProxyCreator#createProxy生成代理
ReflectiveAspectJAdvisorFactory#getAdvisor
ReflectiveAspectJAdvisorFactory#getAdvice
AnnotationAwareAspectJAutoProxyCreator向spring容器中添加Bean定义
.AspectJAwareAdvisorAutoProxyCreator#shouldSkip
ObjenesisCglibAopProxy#createProxyClassAndInstance
buildAdvisors构建所有的Advisor
ReflectiveMethodInvocation#proceed按照顺序依次执行调用链
获取所有@Pointcut方法,并封装成AspectJExpressionPointcut
getAdvicesAndAdvisorsForBean
CglibAopProxy.DynamicAdvisedInterceptor#intercept
下面三种情况会使用Jdk的代理代理对象是接口本身就是一个jdk的代理类Lambda类
.JdkDynamicAopProxy#invoke
findEligibleAdvisors
AbstractAutoProxyCreator#wrapIfNecessary如果需要则生成代理对象
AdvisorChainFactory#getInterceptorsAndDynamicInterceptionAdvice根据方法获取调用链
AbstractAutoProxyCreator#postProcessAfterInitializationBean 实例化后调用
ReflectiveAspectJAdvisorFactory#getPointcut
BeanFactoryAspectJAdvisorsBuilder#buildAspectJAdvisors对所有@Aspect构建所有advisor
AspectJAutoProxyRegistrar
@Before:MethodBeforeAdvice@AfterReturning:AfterReturningAdvice@AfterThrowing:MethodInterceptor@After:MethodInterceptor@Around:MethodInterceptor真实的执行方法
InstantiationAwareBeanPostProcesso#postProcessBeforeInstantiationBean 实例化前
0 条评论
下一页