类简介
1.切点类
-
**AspectJExpressionPointcut类:**Pointcut接口的实现,该实现使用AspectJ weaver计算切入点表达式的切入点
-
**InstantiationModelAwarePointcutAdvisorImpl类:**AspectJPointcutAdvisor的内部实现。该类将为每个目标方法提供这个advisor的一个实例
所有的增强都是由Advisor的实现类InstantiationModelAwarePointcutAdvisorImpl统一封装
-
**AopNamespaceUtils抽象类:**用于处理“aop”命名空间标签的内部使用的自动代理创建者注册的工具类
-
**AopConfigUtils抽象类:**处理AOP自动代理创建者注册的工具类
-
**AbstractAutoProxyCreator抽象类:**实现了BeanPostProcessor,用于将每个符合条件的bean包装为AOP代理,在调用bean本身之前委托给指定的拦截器。
-
**AbstractAdvisorAutoProxyCreator抽象类:**AbstractAutoProxyCreator的子类,通用自动代理创建器,它基于检测到的每个bean的顾问为特定bean构建AOP代理。
- 子类必须实现抽象findCandidateAdvisors()方法,以返回应用于任何对象的顾问列表。
- 子类也可以覆盖继承的shouldSkip方法,从自动代理中排除某些对象。
-
**AspectJAwareAdvisorAutoProxyCreator类:**当多个通知来自同一切面时,公开AspectJ的调用上下文并理解AspectJ的通知优先规则的AbstractAdvisorAutoProxyCreator子类。
-
**InfrastructureAdvisorAutoProxyCreator类:**该类只考虑基础架构advisor bean的自动代理创建者,忽略任何程序定义的advisor。AbstractAdvisorAutoProxyCreator的子类。
-
**BeanFactoryAspectJAdvisorsBuilder类:**该类从Bean工厂中获取标记为@AspectJ的Bean,并基于它们构建Spring advisor,以便与自动代理一起使用。
-
**AspectMetadata类:**AspectJ切面类的元数据
-
**MetadataAwareAspectInstanceFactory接口:**AspectInstanceFactory接口的子类,该类返回与AspectJ注解相关的AspectMetadata类
-
**LazySingletonAspectInstanceFactoryDecorator类:**Decorator使 MetadataAwareAspectInstanceFactory仅实例化一次
-
**AspectJAdvisorFactory接口:**可以从用AspectJ注释语法注释的类中创建Spring AOP advisor的工厂接口类。
-
**ReflectiveAspectJAdvisorFactory类:**根据AspectJ注释语法的类,使用反射调用相应的通知方法,可以创建Spring AOP advisor的工厂
2. 匹配类
- **MethodMatcher接口:**Pointcut接口的一部分,用来检查是否符合目标方法的通知。
- **IntroductionAwareMethodMatcher接口:**考虑引介增强的MethodMatcher接口的实现
3. 代理类
-
**AopProxyFactory接口:**创建AOP代理的工厂实现的接口
public interface AopProxyFactory { AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException; }
-
**DefaultAopProxyFactory类:**AopProxyFactory的默认实现,创建CGlib或Jdk动态代理
public class DefaultAopProxyFactory implements AopProxyFactory, Serializable { @Override public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException { if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) { Class<?> targetClass = config.getTargetClass(); if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) { return new JdkDynamicAopProxy(config); } return new ObjenesisCglibAopProxy(config); } else { return new JdkDynamicAopProxy(config); } } private boolean hasNoUserSuppliedProxyInterfaces(AdvisedSupport config) { //..... } }
-
**ProxyCreatorSupport类:**代理工厂的基类。提供对可配置的AopProxyFactory的方便访问。
该类内部属性AopProxyFactory接口
-
**ProxyFactory类:**继承于ProxyCreatorSupport类,用于AOP代理的工厂,用于编程使用,而不是通过bean工厂中的声明性设置。这个类提供了在定制用户代码中获取和配置AOP代理实例的一种简单方法。
4. Advisor类
-
**Advisor接口:**支持不同类型的通知
public interface Advisor { /** * 返回该切面的通知,可能是interceptor,前置通知等 */ Advice getAdvice(); /** * 返回该通知是与特定实例相关联,还是与从同一个Spring bean工厂获得的建议类的所有实例共享。 */ boolean isPerInstance(); }
-
**PointcutAdvisor接口:**由切入点驱动的所有顾问的超接口。这涵盖了几乎所有的顾问,除了介绍顾问(引介增强),方法级匹配不适用。
public interface PointcutAdvisor extends Advisor { /** * Get the Pointcut that drives this advisor. */ Pointcut getPointcut(); }
-
**AbstractPointcutAdvisor抽象类:**针对PointcutAdvisor实现的抽象基类。可以为返回特定的切入点/通知或可自由配置的切入点/通知进行子类化。
-
**AbstractGenericPointcutAdvisor抽象类:**许配置任何通知的抽象泛型PointcutAdvisor
public abstract class AbstractGenericPointcutAdvisor extends AbstractPointcutAdvisor { private Advice advice; public void setAdvice(Advice advice) { this.advice = advice; } @Override public Advice getAdvice() { return this.advice; } }
-
**DefaultPointcutAdvisor类:**切入点驱动的Advisor方便实现
public class DefaultPointcutAdvisor extends AbstractGenericPointcutAdvisor implements Serializable { private Pointcut pointcut = Pointcut.TRUE; public DefaultPointcutAdvisor() { } public DefaultPointcutAdvisor(Advice advice) { this(Pointcut.TRUE, advice); } public DefaultPointcutAdvisor(Pointcut pointcut, Advice advice) { this.pointcut = pointcut; setAdvice(advice); } public void setPointcut(Pointcut pointcut) { this.pointcut = (pointcut != null ? pointcut : Pointcut.TRUE); } @Override public Pointcut getPointcut() { return this.pointcut; } }
5.适配器
注:将advice转换成MethodInterceptor
AspectJMethodBeforeAdvice ——> MethodBeforeAdviceAdapter ——> MethodBeforeAdviceInterceptor
AspectJAfterAdvice ——> AspectJAfterAdvice已经实现了MethodInterceptor,即自身不需要适配器进行转换
AspectJAfterReturningAdvice ——> AfterReturningAdviceAdapter ——> AfterReturningAdviceInterceptor
AspectJAfterThrowingAdvice ——> ThrowsAdviceAdapter ——> ThrowsAdviceInterceptor
AspectJAroundAdvice ——> AspectJAroundAdvice已经实现了MethodInterceptor,即自身不需要适配器进行转换
-
**AdvisorAdapter接口:**允许处理新的顾问和通知类型的可扩展接口
public interface AdvisorAdapter { /** * 这个适配器理解这个通知对象吗?使用包含此通知的Advisor工具调用getInterceptors方法有效吗? */ boolean supportsAdvice(Advice advice); /** * Return an AOP Alliance MethodInterceptor exposing the behavior of * the given advice to an interception-based AOP framework. */ MethodInterceptor getInterceptor(Advisor advisor); }
-
**AdvisorAdapterRegistry接口:**注册Advisor adapters的接口,这个接口是SPI(Service Provider Interface)接口,不能被用户所实现。
public interface AdvisorAdapterRegistry { /** * 给定advice,返回advisor */ Advisor wrap(Object advice) throws UnknownAdviceTypeException; /** * Return an array of AOP Alliance MethodInterceptors to allow use of the * given Advisor in an interception-based framework. */ MethodInterceptor[] getInterceptors(Advisor advisor) throws UnknownAdviceTypeException; /** * Register the given AdvisorAdapter. Note that it is not necessary to register * adapters for an AOP Alliance Interceptors or Spring Advices: these must be * automatically recognized by an AdvisorAdapterRegistry implementation. */ void registerAdvisorAdapter(AdvisorAdapter adapter); }
6. InterceptorAndDynamicMethodMatcher
-
**InterceptorAndDynamicMethodMatcher类:**内部框架类,包装了MethodInterceptor和MethodMatcher
class InterceptorAndDynamicMethodMatcher { final MethodInterceptor interceptor; final MethodMatcher methodMatcher; public InterceptorAndDynamicMethodMatcher(MethodInterceptor interceptor, MethodMatcher methodMatcher) { this.interceptor = interceptor; this.methodMatcher = methodMatcher; } }
7. 织入
-
**LoadTimeWeaverAware接口:**接口由任何对象实现,该对象希望得到应用程序上下文的默认LoadTimeWeaver的通知。
public interface LoadTimeWeaverAware extends Aware { void setLoadTimeWeaver(LoadTimeWeaver loadTimeWeaver); }
-
**AspectJWeavingEnabler类:**Post-processor that registers AspectJ’s ClassPreProcessorAgentAdapter with the Spring application context’s default LoadTimeWeaver.
public class AspectJWeavingEnabler implements BeanFactoryPostProcessor, BeanClassLoaderAware, LoadTimeWeaverAware, Ordered { public static final String ASPECTJ_AOP_XML_RESOURCE = "META-INF/aop.xml"; private ClassLoader beanClassLoader; private LoadTimeWeaver loadTimeWeaver; //...... }
-
**DefaultContextLoadTimeWeaver类:**Default LoadTimeWeaver bean for use in an application context, decorating an automatically detected internal LoadTimeWeaver.
自动代理生成器
-
**AnnotationAwareAspectJAutoProxyCreator类:**AspectJAwareAdvisorAutoProxyCreator的子类,用于处理当前应用程序上下文中所有AspectJ注释切面,以及Spring Advisors。
-
**DefaultAdvisorAutoProxyCreator类:**AbstractAdvisorAutoProxyCreator的子类,该类实现了BeanPostProcessor,它基于当前BeanFactory中的所有候选顾问创建AOP代理。这个类是完全通用的,它不包含处理任何特定方面(如池化方面)的特殊代码。
- DefaultAdvisorAutoProxyCreator是一种自定义代理生成器,且比较暴力 ,会把容器内所有的切面向所有的目标对象织入,而且切面只能是顾问的形式
-
**BeanNameAutoProxyCreator类:*AbstractAutoProxyCreator的子类,通过名称列表将bean标识为代理的自动代理生成器,如检查直接匹配、“xxx”和“*xxx”匹配。
1、匹配Bean的名称自动创建匹配到的Bean的代理,实现类BeanNameAutoProxyCreator
2、根据Bean中的AspectJ注解自动创建代理,实现类AnnotationAwareAspectJAutoProxyCreator
3、根据Advisor的匹配机制自动创建代理,会对容器中所有的Advisor进行扫描,自动将这些切面应用到匹配的Bean中,实现类DefaultAdvisorAutoProxyCreator