Spring中AOP底层原理
2021-10-14 10:38:38 0 举报
Spring中AOP底层原理
作者其他创作
大纲/内容
DynamicUnadvisedInterceptor
初始化前
后置处理器 before
resolveBeforeInstantiation实例化前
applyBeanPostProcessorsBeforeInitialization
代理对象执行方法时,会经过DynamicAdvisedInterceptor
生成代理子流程
创建代理对象createProxy
给原始对象填充属性
createBeanInstance
getProxy
exposeProxy
findCandidateAdvisors找到所有的Advisor
getCallbacks
true
specificInterceptors
proxyFactory.getProxy
设置aop拦截DynamicAdvisedInterceptor
buildAdvisors
false
创建代理对象执行子流程
StaticUnadvisedInterceptor
createProxyClassAndInstance
判断是否JDK代理proxyTargetClass添加切面 addAdvisors是否使用了@DeclareParents(setTargetSource)
bean生命周期
构造Enhancer对象
populateBean
invokeInitMethods
isStatic
根据当前调用的方法和类型筛选advisor
AbstractAutoProxyCreator.postProcessBeforeInstantiation
MethodInterceptor执行完之后,执行被代理对象的方法interceptor.invoke
初始化
得到所有匹配的MethodInterceptor组成一个链
DynamicAdvisedInterceptorFixedChainStaticTargetInterceptorHashCodeInterceptorEqualsInterceptor
getInterceptorsAndDynamicInterceptionAdvice
createAopProxy
将specificInterceptors和commonInterceptors合并
初始化后,这里开始进行AOP
实例化得到对象
设置target拦截
开始执行MethodInterceptor,分不同类型
sortAdvisors排序
初始化后
判断bean是否要进行AOP(shouldSkip)||isInfrastructureClassPointcut|Advisor|Advice 不需要进行AOP
wrapIfNecessary
调用CglibMethodInvocation.proceed方法
findAdvisorsThatCanApply筛选当前匹配的Advisor和adivce
applyBeanPostProcessorsAfterInitialization
如果ProxyFactory的isOptimize为true,或者isProxyTargetClass为true,或者被代理对象没有实现接口,或者只实现了SpringProxy这个接口那么则利用Cglib进行动态代理,但如果被代理类是接口,或者被代理类已经是进行过JDK动态代理而生成的代理类了则只能进行JDK动态代理其他情况都会进行JDK动态代理,比如被代理类实现了除SpringProxy接口之外的其他接口
构建一个ProxyFactory代理工具类
createBean
配置ProxyFactory
IntroductionAdvisor和PointcutAdvisor
0 条评论
下一页