AOP解析
https://www.cnblogs.com/liuyk-code/p/9886033.html 里面用的spring版本是4.xx
@Around("pointcut()")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("start---------doAround----------");
final Signature signature = pjp.getSignature();
final Class declaringType = signature.getDeclaringType();
final Class superclass = declaringType.getSuperclass();
final Method[] declaredMethods = superclass.getMethods();
for (Method declaredMethod : declaredMethods) {
if(declaredMethod.getName().contains("test")){
declaredMethod.setAccessible(true);
declaredMethod.invoke(superclass.newInstance(), new Object[]{"111111111"});
}
}
final Object proceed = pjp.proceed();
System.out.println("end---------doAround----------");
return proceed;
}
@EnableAspectJAutoProxy可以看到通过@Import导入了一个类AspectJAutoProxyRegistrar,这个类实现了ImportBeanDefinitionRegistrar 接口。
refresh:530, AbstractApplicationContext
invokeBeanFactoryPostProcessors:692, AbstractApplicationContext
invokeBeanFactoryPostProcessors:91, PostProcessorRegistrationDelegate
invokeBeanDefinitionRegistryPostProcessors:271, PostProcessorRegistrationDelegate
postProcessBeanDefinitionRegistry:233, ConfigurationClassPostProcessor
processConfigBeanDefinitions:328, ConfigurationClassPostProcessor
loadBeanDefinitions:118, ConfigurationClassBeanDefinitionReader
loadBeanDefinitionsForConfigurationClass:146, ConfigurationClassBeanDefinitionReader
loadBeanDefinitionsFromRegistrars:357, ConfigurationClassBeanDefinitionReader
registerBeanDefinitions:45, AspectJAutoProxyRegistrar
registerAspectJAnnotationAutoProxyCreatorIfNecessary:93, AopConfigUtils
registerAspectJAnnotationAutoProxyCreatorIfNecessary:100, AopConfigUtils
forceAutoProxyCreatorToUseClassProxying:106, AopConfigUtils
registerOrEscalateApcAsRequired:139, AopConfigUtils
通过堆栈信息可以看到会注入一个beanName为internalAutoProxyCreator的beanDefinition,
这个beanDefinition是为了之后得到AnnotationAwareAspectJAutoProxyCreator而创建的。
AnnotationAwareAspectJAutoProxyCreator的创建过程:
refresh:533, AbstractApplicationContext
registerBeanPostProcessors:708, AbstractApplicationContext
registerBeanPostProcessors:224, PostProcessorRegistrationDelegate
(根据之前的internalAutoProxyCreator的beanDefinition,最终
这里返回的结果得到AnnotationAwareAspectJAutoProxyCreator类型的BeanPostProcessor)
getBean:204, AbstractBeanFactory
doGetBean:315, AbstractBeanFactory
getSingleton:222, DefaultSingletonBeanRegistry
getObject:-1, 48368209
lambda$doGetBean$0:317, AbstractBeanFactory
createBean:495, AbstractAutowireCapableBeanFactory
doCreateBean:573, AbstractAutowireCapableBeanFactory
initializeBean:1681, AbstractAutowireCapableBeanFactory
invokeAwareMethods:1716, AbstractAutowireCapableBeanFactory
setBeanFactory:58, AbstractAdvisorAutoProxyCreator
AnnotationAwareAspectJAutoProxyCreator的执行时机:
finishBeanFactoryInitialization:867, AbstractApplicationContext
preInstantiateSingletons:759, DefaultListableBeanFactory
getBean:199, AbstractBeanFactory
doGetBean:315, AbstractBeanFactory
getSingleton:222, DefaultSingletonBeanRegistry
getObject:-1, 1392869972
lambda$doGetBean$0:317, AbstractBeanFactory
createBean:484, AbstractAutowireCapableBeanFactory
resolveBeforeInstantiation:1033, AbstractAutowireCapableBeanFactory
applyBeanPostProcessorsBeforeInstantiation:1060, AbstractAutowireCapableBeanFactory
postProcessBeforeInstantiation:248, AbstractAutoProxyCreator 此方法结束后会返回该bean代理类
在所有bean初始化之前都会进行拦截,调用postProcessBeforeInstantiation.
之后再调用postProcessAfterInitialization 可以被增强的类都保存在advisedBeans这个map中,value=ture;
postProcessAfterInitialization:304, AbstractAutoProxyCreator
wrapIfNecessary:352, AbstractAutoProxyCreator
getAdvicesAndAdvisorsForBean:76, AbstractAdvisorAutoProxyCreator
findEligibleAdvisors:100, AbstractAdvisorAutoProxyCreator
wrapIfNecessary:355, AbstractAutoProxyCreator
createProxy:473, AbstractAutoProxyCreator 创建代理对象过程中,先创建一个代理工厂,获取到所有的通知方法,将这些通知方法和需要增强的目标类注入代理工厂,
代理工厂再创建代理对象。
getProxy:110, ProxyFactory
createAopProxy:105, ProxyCreatorSupport
createAopProxy:51, DefaultAopProxyFactory
aAound()为增强的目标方法
intercept:661, CglibAopProxy$DynamicAdvisedInterceptor intercept
这个方法里面调用getInterceptorsAndDynamicInterceptionAdvice方法可以获取需要执行增加的类和方法(这里的类和方法指的是原本的类和方法)
getInterceptorsAndDynamicInterceptionAdvice:483, AdvisedSupport getInterceptorsAndDynamicInterceptionAdvice()
getInterceptorsAndDynamicInterceptionAdvice:68, DefaultAdvisorChainFactory getInterceptorsAndDynamicInterceptionAdvice()->
registry.getInterceptors(advisor);从这个方法中获取
之后:
intercept:688, CglibAopProxy$DynamicAdvisedInterceptor
proceed:185, ReflectiveMethodInvocation
invoke:92, ExposeInvocationInterceptor
proceed:162, ReflectiveMethodInvocation
AOP实现的不同阶段:
一般情况:
在spring实例化一个对象之后,填充属性之后执行创建的代理类的生命周期,在这个周期中如果有AOP功能就会完成。
循环引用:
在填充属性之前就完成了。

浙公网安备 33010602011771号