spring学习_03-aop源码解析

实现:

1、定义切面类:

spring学习_03-aop源码解析

2、被拦截的方法

spring学习_03-aop源码解析

翻一翻源码,总体介绍流程:

1、configuration中,增加 @EnableAspectJAutoProxy

     跟进: @Import(AspectJAutoProxyRegistrar.class)

     class AspectJAutoProxyRegistrar implements ImportBeanDefinitionRegistrar

     从这里我们可以知道,EnableAspectJAutoProxy本质就是注册了一个beanDefinition:                                                                                                                                                          AnnotationAwareAspectJAutoProxyCreator

看一下类的结构图

spring学习_03-aop源码解析

 

关键的几个父类: Aware(BeanFactoryAware)、Ordered、SmartInstantitationAwareBeanPostProcessor

aop的核心类先大概了解,从bean加载的流程分析

3、注册beanPostProcessor,刚从父类看到,核心类本质是一个后置处理器,所以加载的时候,会注册

spring学习_03-aop源码解析

   加载所有的beanPostProcessor

            String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class)

   遍历postProcessorNames,根据 PriorityOrdered、Ordered等分批处理

spring学习_03-aop源码解析

核心类实现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方法,关键是后置处理生成代理对象

spring学习_03-aop源码解析

  Object[] specificInterceptors = getAdvicesAndAdvisorsForBean()  拿到所有的advices

  createProxy  生成proxy对象,跟进去

spring学习_03-aop源码解析

  getProxy跟进去 createAopProxy().getProxy(classLoader);

  cglib或者jdk生成proxy,进cglib