spring学习_03-aop源码解析
实现:
1、定义切面类:
2、被拦截的方法
翻一翻源码,总体介绍流程:
1、configuration中,增加 @EnableAspectJAutoProxy
跟进: @Import(AspectJAutoProxyRegistrar.class)
class AspectJAutoProxyRegistrar implements ImportBeanDefinitionRegistrar
从这里我们可以知道,EnableAspectJAutoProxy本质就是注册了一个beanDefinition: AnnotationAwareAspectJAutoProxyCreator
看一下类的结构图
关键的几个父类: Aware(BeanFactoryAware)、Ordered、SmartInstantitationAwareBeanPostProcessor
aop的核心类先大概了解,从bean加载的流程分析
3、注册beanPostProcessor,刚从父类看到,核心类本质是一个后置处理器,所以加载的时候,会注册
加载所有的beanPostProcessor
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class)
遍历postProcessorNames,根据 PriorityOrdered、Ordered等分批处理
核心类实现ordered,实现后置处理器的bean创建,在这里,实现核心bean的创建,用于服务业务bean的创建
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
上述是核心类 AbstractAutoProxyCreator
=========================================================================================
业务bean创建
finishBeanFactoryInitialization()
beanFactory.preInstantiateSingletons();
getBean(beanName);
doGetBean
createBean(beanName, mbd, args);
doCreateBean(beanName, mbdToUse, args);
instanceWrapper = createBeanInstance(beanName, mbd, args); 方法底层调用constract反射生成bean对象(Calculator) populateBean(beanName, mbd, instanceWrapper); 依赖注入
exposedObject = initializeBean(beanName, exposedObject, mbd); init方法,关键是后置处理生成代理对象
Object[] specificInterceptors = getAdvicesAndAdvisorsForBean() 拿到所有的advices
createProxy 生成proxy对象,跟进去
getProxy跟进去 createAopProxy().getProxy(classLoader);
cglib或者jdk生成proxy,进cglib