Spring AOP的主要工作就是围绕以下三点展开的:
- Pointcut(切点):过滤条件,指定在那些类的那些方法上织入横切逻辑;
- Advice(通知):用于描述横切逻辑和方法的具体织入点;
Advisor(通知器):将Pointcut和Advice两者组装起来;
spring利用JDK或CGLIB的动态代理技术采用统一方式为目标bean创建织入切面的代理对象。
- jdk动态代理技术涉及类:InvocationHandler、Proxy
cglib动态代理技术涉及类:MethodInteceptor、Enhancer
个人理解springaop
- 代理对象的创建过程:在创建目标对象后(when),根据条件过滤符合切点要求的对象(what),创建代理对象(how);
- 代理方法的调用过程:根据依次执行通知器链表中的横切逻辑
// 一、解析aop标签,创建对应的BeanDefinition对象
NamespaceHandler namespaceHandler;
AopNamespaceHandler aopNamespaceHandler;
// 自动代理创建器,用于创建代理对象
// 实现BeanPostProcessor接口,该接口用于实例化前后、初始化前后调用
// 继承ProxyProcessorSupport类,用于创建代理对象
ProxyProcessorSupport proxyProcessorSupport;
SmartInstantiationAwareBeanPostProcessor smartInstantiationAwareBeanPostProcessor;
AbstractAutoProxyCreator abstractAutoProxyCreator;
AbstractAdvisorAutoProxyCreator abstractAdvisorAutoProxyCreator;
AspectJAwareAdvisorAutoProxyCreator aspectJAwareAdvisorAutoProxyCreator;
// 二、创建代理对象的条件:创建bean对象实例,createBean:populateBean:InitializeBean
AbstractAutowireCapableBeanFactory abstractAutowireCapableBeanFactory;
// 三、创建代理对象的步骤
// 3.1 获得符合条件的Advisor:getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null)
AbstractAdvisorAutoProxyCreator abstractAdvisorAutoProxyCreator1;
BeanFactoryAdvisorRetrievalHelper beanFactoryAdvisorRetrievalHelper;
BeanFactoryAdvisorRetrievalHelperAdaptor beanFactoryAdvisorRetrievalHelperAdaptor;
// 切面(adviceBeanName,pointcut)
Advisor advisor;
PointcutAdvisor pointcutAdvisor;
AbstractPointcutAdvisor abstractPointcutAdvisor;
// 接口
BeanFactoryAware beanFactoryAware;
AbstractBeanFactoryPointcutAdvisor abstractBeanFactoryPointcutAdvisor;
DefaultBeanFactoryPointcutAdvisor defaultBeanFactoryPointcutAdvisor;
// 过滤条件切点(Pointcut)
AspectJExpressionPointcut aspectJExpressionPointcut;
// 类过滤器:matches(Class