《Spring 5.x源码解析之Spring AOP API整体的设计与实现》

《Spring 5.x源码解析之Spring AOP API整体的设计与实现》

学好路更宽,钱多少加班。---- mercyblitz

一、前言

大家好,欢迎阅读《Spring 5.x源码解析》系列,本篇作为该系列的第一篇,先入手AOP源码解析,后补齐IoC源码内容。文章内容基于小马哥讲 Spring AOP 编程思想以及Spring源码深度解析(第2版)。笔者多次阅读上述学习资料,形成个人关于Spring的知识总结,希望能帮助各位小伙伴!

二、本文概览

在这里插入图片描述

三、核心API介绍

1、JoinPoint(连接点)

在Spring AOP中,有关连接点实现的API有以下几种:

在这里插入图片描述

对上述API,我们下面做下详细介绍:

  • JoinPoint-最顶层接口,在AOP术语中表示:程序运行时的连接点。运行时连接点是发生在静态连接点(程序真正发生调用的地方)上的事件。它包含以下几种方法:
    • Object proceed() : 进行链中下一个拦截器的动作
    • Object getThis() : 返回当前连接点所持有的静态对象实例
    • AccessiblePart getStaticPart() : 返回当前连接点所在的静态代码块
  • Invocation-继承JoinPoint,并提供获取目标方法参数的功能,也可以进行修改以变更目标方法的行为
    • Object[] getArguments() : 将参数作为数组对象进行获取,并且可以对参数进行修改来该表目标方法的行为
  • MethodInvocation-继承Invocation,是对方法调用的描述,在方法被调用的时候提供给拦截器
    • Method getMethod() : 返回被调用的方法对象
  • ConstructorInvocation-继承Invocation,对构造器调用的描述,Spring AOP仅支持对方法调用的拦截,所以该接口在Spring内部并没有被实现
  • ProxyMethodInvocation-继承MethodInvocation,允许目标方法访问代理对象
    • Object getProxy() : 返回代理对象
    • MethodInvocation invocableClone() : 创建此对象的克隆,在拦截器调用mi.proceed()之前进行克隆,则拦截器可执行多次mi.proceed()
    • MethodInvocation invocableClone(Object… arguments) : 创建此对象的克隆,对上面方法的重载,支持修改方法的参数
    • void setArguments(Object… arguments) : 修改方法的参数,执行该动作之后,后续的拦截器执行链都会使用新参数进行目标连接点的调用
    • void setUserAttribute(String key,@Nullable Object value) : 对用户属性添加到此Invocation,方便后续执行链中获取到该值,AOP框架不使用该方法,该方法提供给用户使用
    • Object getUserAttribute(String key) : 获取指定Key的用户属性
  • ReflectiveMethodInvocation-继承ProxyMethodInvocation,Spring AOP对MethodInvocation的具体实现,基于JDK反射实现连接点的执行
  • CglibMethodInvocation-继承ReflectiveMethodInvocation,Spring AOP对MethodInvocation的另一种具体实现,基于Cglib字节码提升实现连接点的执行,重写了父类的invokeJoinPoint()方法,改变了其行为

2、Pointcut(切入点)

在Spring AOP中,有关Pointcut实现的API有以下几种:

在这里插入图片描述
关于Pointcut接口的实现有很多,上述是使用较多的实现。对于各个API的详细介绍如下:

  • Pointcut-最顶层接口,定义了切入点的核心组件(ClassFilter以及MethodMatcher),并提供默认Pointcut实现-TruePointcut,即所有方法都匹配
  • ClassFilter-切入点核心组件之一,在切入点匹配时进行类筛选的功能
    • boolean matchs(Class<?> clazz) : 实现对目标类的过滤
    • 默认实现-TrueClassFilter,默认所有类均符合条件
  • MethodMatcher-切入点核心组件之一,在切入点匹配是进行目标方法过滤的功能,提供静态与动态时对方法进行评估两种功能
    • boolean matches(Method method, Class<?> targetClass) : 静态匹配
    • boolean isRuntime() : 是否进行运行时匹配
    • boolean matches(Method method, Class<?> targetClass, Object… args) : 运行时匹配
    • 默认实现-TrueMethodMatcher,默认匹配所有方法
  • StaticMethodMatcherPointcut-便利实现,继承MethodMatcher,实现Pointcut。提供方法静态匹配,不支持运行时匹配
    • 该类为抽象接口,子类继承后实现boolean matches(Method method, Class<?> targetClass)静态匹配方法即可
    • JdkRegexpMethodPoint即是继承StaticMethodMatcherPointcut,扩展了正则表达式匹配的实现
  • ContolFlowPointcut-控制流实现,提供异常栈的方法匹配,是一个方法链是式的匹配,如果目标方法被其中某一个StackTraceElement匹配则返回true,否则返回false。这个实现有点影响性能,一般不使用
  • ComposablePointcut-组合实现,提供union、intersection功能实现多个Pointcut进行组合匹配的功能
  • ExpressionPointcut-通过字符串表达式实现切入点
    • String getExpression() : 返回该切入点的字符串表达式
  • AbstractExpressionPointcut-实现ExpressionPointcut,提供location以及expression字符串属性的功能
  • AspectJExpressionPointcut-继承AbstractExpressionPointcut,实现通过AspectJ weaver计算切入点表达式
    • 支持十种原语实现,就不粘贴在这里,详情可去看源码org.springframework.aop.aspectj.AspectJExpressionPointcut#SUPPORTED_PRIMITIVES
    • obtainPointcutExpression() : 构建AspectJ表达式,AspectJExpressionPointcut的核心方法
    • boolean matches(Method method, Class<?> targetClass) : 静态匹配,通过AspectJ weaver计算出JoinPointMatch,调用其matches方法返回最终是否匹配
    • boolean isRuntime() : 是否进行运行时匹配,obtainPointcutExpression().mayNeedDynamicTest()
    • boolean matches(Method method, Class<?> targetClass, Object… args) : 运行时匹配,通过AspectJ weaver计算出JoinPointMatch,调用其matches方法返回最终是否匹配

3、Advice(执行动作)

在Spring AOP中,有关Advice实现的API如下所示:

在这里插入图片描述

关于Advice接口,可以分为前置、后置(最终、异常、返回)、环绕三种拦截动作来看,下面我们详细介绍下相应的API接口:

  • Advice-顶层接口,是一个标记接口,无任何动作
  • BeforeAdvice-继承Advice,是一个标记接口
  • MethodBeforeAdvice-继承BeforeAdvice,提供方法前置拦截功能
    • void before(Method method, Object[] args, @Nullable Object target) : 方法前置调用接口
  • AfterAdvice-继承Advice,是一个标记接口
  • AfterReturningAdvice-继承AfterAdvice,提供方法成功返回后的回调功能
    • void afterReturning(@Nullable Object returnValue,Method method,Object[] args,@Nullable Object target) : 回调接口
  • ThrowsAdvice-继承AfterAdvice,是一个标记接口,似乎没有类实现它,在ThrowsAdviceInterceptor中的throwsAdvice字段被声明为Object类型
  • Interceptor-继承Advice,也是一个标记接口
  • MethodInterceptor-继承Interceptor,顾名思义,方法拦截器,在方法调用途中对目标方法进行拦截。也是AOP框架中拦截器链对象的统一接口
    • MethodBeforeAdviceInterceptor : 前置拦截器,具体实现原理是在目标方法被调用前,先执行MethodBeforeAdvice#before(xxx)实现前置拦截
    • AfterReturningAdviceIntercetpor : 后置返回拦截器,具体实现原理是在目标方法被成功调用后,继续执行AfterReturningAdvice#afterReturning(xxx)实现方法返回拦截
    • ThrowsAdviceInterceptor : 后置异常返回拦截器,具体实现原理是在捕捉目标方法执行异常,如果符合拦截的异常类型,则通过反射执行对应的拦截方法
    • AspectJAfterAdvice、AspectJAroundAdvice放在AbstractAspectJAdvice中说
  • AbstractAspectJAdvice-包装Aspect切面或者Aspect注解通知的一个基类,提供Spring对AspectJ相关方法调用(黑盒)
    • AspectJMethodBeforeAdvice : 前置拦截执行动作实现,基于反射实现before(xxx)方法
    • AspectJAfterReturningAdvice : 后置方法返回执行动作实现,基于反射实现afterReturning(xxx)方法
    • AspectJAfterThrowingAdvice : 后置方法异常拦截执行动作实现,基于反射
    • AspectJAfterAdvice : 后置最终拦截执行动作实现,基于反射
    • AspectJAroundAdvice : 环绕拦截执行动作实现,基于反射
    • 上述各类执行动作最终都是调用AbstractAspectJAdvice基类提供的invokeAdviceMethod(@Nullable JoinPointMatch jpMatch, @Nullable Object returnValue, @Nullable Throwable ex)方法,实现各Advice执行动作

4、Advisor

在Spring AOP中,有关Advisor的API如下图所示:

在这里插入图片描述
关于Advisor及其子接口,下面进行详细介绍:

  • Advisor-最顶层接口,可以提供不同类型的Advice

    • Advice getAdvice() : 获取当前切面的Advice,可以是一个Interceptor、BeforeAdvice、ThrowsAdvice等
    • boolean isPerInstance() : 目前我也不知道它的用处,AOP框架中未使用它,典型的Advisor实现总是返回true
  • PointcutAdvisor-继承Advisor,扩展Pointcut与Advice关联的功能

    • Pointcut getPointcut() : 获取关联的切入点
  • StaticMethodMatcherPointcutAdvisor-实现PointcutAdvisor,对于静态切入点驱动的Advisor的便捷实现

  • InstantiationModelAwarePointcutAdvisor-继承PointcutAdvisor,扩展Advice是否具有懒加载策略,是否意味着延迟初始化

  • InstantiationModelAwarePointcutAdvisorImpl-AspectJPointcutAdvisor的内部实现,每个目标方法(Advice方法)都拥有一个该实例

  • AspectPointcutAdvisor-它使AbstractAspectJAdvice适应PointcutAdvisor接口

  • AbstractPointcutAdvisor-实现PointcutAdvisor,是一个抽象基类。可以使子类获取指定的Pointcut or Advice或者自由配置相应的Pointcut or Advice

  • AbstractBeanFactoryPointcutAdvisor-继承AbstractPointcutAdvisor,与Spring IoC整合,可以指定IoC容器中的Advice Bean,通过BeanName依赖查找来建立关联

  • DefaultBeanFactoryPointcutAdvisor-AbstractBeanFactoryPointcutAdvisor具体实现

  • AbstractGenricPointcutAdvisor-抽象类,是PointcutAdvisor的通用实现,允许任何Advice被配置

  • DefaultPointcutAdvisor-便利实现,允许任何Pointcut与Advice一起使用

  • IntroductionAdvisor-继承Advisor,实现Introduction与Advisor关联的功能,这里简单提一下Introduction Advice,它是Spring中特殊的拦截Advice,仅对匹配类,不匹配方法,这也使被代理对象能够被增强

    • ClassFilter getClassFilter() : 获取类匹配器。
    • void validateInterfaces() : 校验接口
    • Class[] getInterfaces() : 获取额外被当前Advisor增强的接口
  • DefaultIntroductionAdvisor-IntroductionAdvisor的简单实现

  • DeclareParentsAdvisor-与@DeclareParents注解关联,实现AspectJ注解一样的行为。简单说就是声明一个字段被@DeclareParents注解注释,该字段对应实例的方法在目标方法的前or后执行,实现一个类似AspectJ拦截的功能

5、AdvisorAdatper

在Spring AOP中,有关AdvisorAdapter的API如下图所示:

在这里插入图片描述

关于AdvisorAdapter及其子类,详细介绍如下:

  • AdvisorAdapter-最顶层接口,使实现Advice适配到MethodInterceptor的过程,允许外部扩展。一般不提供给用户使用,只有在用户需要向Spring引入新的Advice或者Advisor时才会继续扩展该接口
    • boolean supportsAdvice(Advice advice) : 返回指定的Advice是否被Spring所支持的结果,true or false
    • MethodInterceptor getMethodInteceptor(Advisor advisor) : 返回指定Advisor对应的MethodInterceptor
  • MethodBeforeAdviceAdapter-将MethodBeforeAdvice适配为MethodInterceptor
  • ThrowsAdviceAdapter-将ThrowsAdvice适配为MethodInterceptor
  • AfterReturningAdviceAdapter-将AfterTurningAdvice适配为MethodInterceptor

6、AdvisorAdapterRegistry

在Spring AOP中,有关AdvisorAdapterRegistry的API如下图所示:

在这里插入图片描述
就是这么简单哈哈哈,AdvisorAdapterRegistry作为接口定义注册器需要完成的功能,DefaultAdvisorAdapterRegistry是其具体实现。其接口定义如下所示:

  • AdvisorAdapterRegistry-顾名思义,是Advisor适配器的注册器,这是一个SPI接口,不被任何Spring用户实现
    • Advisor wrap(Object advice) : 给定一个Advice,返回一个包装Advice后的Advisor
    • MethodInterceptor[] getMethodInterceptors(Advisor advisor) : 给定Advisor,返回一个MethodInterceptor数组,因为Advisor与Advice一一对应,Advice与MethodInterceptor一一对应,所以返回数组只有一个Interceptor。
    • void registerAdvisorAdapter(AdvisorAdapter adapter) : 注册AdvisorAdapter
      • 内部是List<AdvisorAdapter>集合对AdvisorAdapter进行存储
  • DefaultAdvisorAdapterRegistry是其具体实现

7、AdvisorChainFactory

在Spring AOP中,有关AdvisorChainFactory的API如下图所示:

在这里插入图片描述
AdvisorChainFactory接口定义功能,DefaultAdvisorChainFactory是及其具体实现,该接口的详细介绍如下:

  • AdvisorChainFactory-它的功能就是获取Advisor执行链
    • List<Object> getInterceptorsAndDynamicInterceptionAdvice(Advised config, Method method, @Nullable Class<?> targetClass) : 获取config下并且与method and targetClass匹配的MethodInterceptor,也有可能包含InterceptorAndDynamicMethodMatchers,所以返回对象为Object
  • DefaultAdvisorChainFactory是其具体实现

8、AopProxy(代理)

在Spring AOP中,有关AopProxy的API如下图所示:

在这里插入图片描述

AopProxy是定义获取代理对象的接口,下面对该接口以及子类实现做一个简单的介绍:

  • AopProxy-提供获取代理对象的功能,可以通过以下两种接口实现
    • Object getProxy() : 创建代理对象,使用默认类加载器,通常是当前线程上下文的类加载器
    • Object getProxy(@Nullable ClassLoader classLoader) : 根据指定的类加载器去创建代理对象
  • JdkDynamicAopProxy-采用JDK动态代理生成代理对象
  • CglibAopProxy-采用Cglib字节码提升生成代理对象
  • ObjenesisCglibAopProxy-基于Objenesis的CglibAopProxy的扩展,在创建对象的时候无需调用类的构造器,在Spring 4之后默认使用

9、AopProxyFactory(代理工厂)

在Spring AOP中,有关AopProxyFactory的API如下图所示:

在这里插入图片描述

AopProxyFactory,代理抽象工厂,创建不同类型的代理,JDK动态代理 or CgLib字节码提升。DefaultAopProxyFactory是默认实现

  • 提供的接口为:createAopProxy(AdvisedSupoort config)
  • 以下条件任意一种符合,Spring则会采用CglibAopProxy代理创建代理对象
    • AdvisedSupport实例optimize字段被设置为true
    • AdvisedSupport实例proxyTargetClass字段被设置为true
    • 被代理对象没有实现任何接口
  • 其余情况均使用JdkDynamicAopProxy代理创建代理对象

10、ProxyConfig(代理配置)

在Spring AOP中,有关ProxyConfig的API如下图所示:

在这里插入图片描述
ProxyConfig,创建代理所需要的配置信息,他是一个超类,定义各种代理创建类所共同需要的配置信息,确保所有的代理创建者都有一致的属性,该API及其子类详细介绍如下:

  • ProxyConfig-代理创建者的超类,提供共同需要的配置信息,该类是一个JavaBean,定义了以下字段
    • proxyTargetClass : 告诉代理创建器,是否需要代理目标类,如果为True的话,则使用Cglib动态代理创建代理对象
    • optimize : 告诉代理创建器,是否采取相应的优化,如果为true的话,则使用Cglibg动态代理创建代理对象
    • oqaque : 告诉代理创建器,是否拒绝将Advised添加到被代理接口中去,如果为true,则不支持代理对象强转为Advised对象
    • exposeProxy : 告诉代理创建器,在创建代理对象的时候是否将代理对象曝光到AopContext中,如果为true,则设置
    • frozen : 告诉代理创建器,代理配置是否被冻结,如果为true,则限制不允许在新增任何Advice
  • AdvisedSupport-AOP代理配置管理器的基类,继承ProxyConfig,具备ProxyConfig的一些字段属性,并提供Advice和Advisor的处理,解放了子类处理该类事务的工作
    • TargetSource targetSource : 目标对象,包访问级别,允许直接访问以提高效率
    • boolean preFilter : Advisor是否已经被预筛选,如果为true,说明Advisor已经被预筛选,可以跳过ClassFilter类匹配的步骤
    • AdvisorChainFactory advisorChainFactory : 获取advisor执行链
    • Map<MethodCacheKey,List<Object>> methodCache : 对方法拥有的advisor执行链做缓存,方法作为key,执行链做为value
    • List<Class<?>> interfaces : 需要被代理实现的接口
    • List<Advisor> advisors : advisor存储集合,如果用户添加的是advice,则会先将advice转换为advisor(会将advice包装成DefaultPointcutAdvisor),然后再存储进来
    • Advisor[] advisorArray : advisor存储数组,它是advisors的副本,在用户读取advisor数据的时候,直接返回该数组对象(数组的检索效率要比集合高)
  • ProxyCreatorSupport-代理工厂的基类,继承AdvisedSupport,具备AdvisedSupport的所有功能,并提供对AopProxyFactory(可配置)的便捷访问
    • AopProxyFactory aopProxyFactory : 创建代理工厂的抽象工厂,用户可指定
    • List<AdvisedSupportListener> listeners : 代理配置的事件监听者,在创建代理工厂会有active事件发出,监听者可以对actived通知有定制的逻辑;在修改代理配置时也会有对应的adviceChanged通知发出,对应的监听者也可以定制特定的逻辑,例如新增、删除advice、增加代理需要实现的接口等等动作
  • ProxyFactory-代理工厂最底层实现的API,用于用户自定义的代码中实现获取或配置AOP代理的简单API
  • ProxyFactoryBean-与IoC容器整合,配置在IoC容器的Bean,创建代理的方式通过FactoryBean实现,可以实现指定targetBeanName以及interceptorNames来实现对目标Bean对象方法的拦截动作,其中interceptorNames支持后缀匹配的方式,例如"interceptor*"
    • String[] interceptorNames : 拦截器的bean名称,支持后缀匹配
    • String targetName : 目标Bean的名称
    • boolean autoDetecInterface : 自动检测接口,默认为true,如果将这个字段设置为false,创建AOP代理则会使用Cglib动态代理
    • boolean singleton : 表示当前被代理对象是否是单例的,如果为true,则为单例的,每次返回相同的代理实例
    • AdvisorAdapterRegistry advisorAdapterRegistry : advisor adapter注册表
    • boolean freezeProxy : 是否冻结代理配置,如果为true,则不能再对代理配置进行修改
    • ClassLoader proxyClassLoader : 代理类加载器,用于创建代理对象,默认为当前线程上下文的类加载器
    • boolean classLoaderConfigured : 标识当前是否被设置了类加载器,如果proxyClassLoader字段被配置,则该字段为true
    • BeanFactory beanFactory : 与IoC容器整合
    • boolean advisorChainInitialized : 表示advisor执行链是否已经完成了初始化,加上标识,避免重复初始化
    • Object singletonInstance : 如果当前被代理对象是单例的,则直接将这个对象返回
  • AspectJProxyFactory-基于AspectJ注解实现的代理工厂,从Spring 2开始引入
    • Map<Class<?>,Object> aspectCache : 单例切面类实例缓存,key为切面的类,value为切面的实例,实例对象由AspectInstanceFactory基于构造器反射创建
    • AspectJAdvisorFactory aspectFactory : 实现类为ReflectiveAspectJAdvisorFactory,通过该类能拿到相应的Advisor,ReflectiveAspectJAdvisorFactory生成Advisor的原理也是通过反射搜寻相应切面类下的方法,过滤出@Pointcut注解外以及非基础设施的方法,把这些方法转换成想用的Advisor

11、AbstractAutoProxyCreator(自动创建代理)

上面提到的ProxyFactory、ProxyFactoryBean、AspectJProxyFactory都是手动创建代理对象的,下面来介绍下在Spring AOP框架中提供自动创建代理对象的API,具体API如下图所示:

在这里插入图片描述

ProxyProcessorSupport和AdvisedSupport是同级的代理创建配置支持的类,都继承ProxyConfig,ProxyProcessorSupport具备自动创建代理对象的通用功能,下面详细介绍下该对象及其子类:

  • ProxyProcessorSupport
    • int order : 设置最低优先级,保证在所有的processor运行完之后再运行,目的是只为一个 todo 没明白啥意思,后续再看
    • ClassLoader proxyClassLoader : 代理类加载器,用于创建代理对象,默认为当前线程上下文的类加载器
    • boolean classLoaderConfigured : 标识当前是否被设置了类加载器,如果proxyClassLoader字段被配置,则该字段为true
    • void evaluateProxyInterfaces(Class<?> beanClass, ProxyFactory proxyFactory) : 该方法用于计算需要被代理的接口,将一些Spring基建配置的回调接口或者内部语言使用的接口排除出去
  • AbstractAutoProxyCreator-自动代理创建的抽象基类,实现SmartInstantiationAwareBeanPostProcessor与IoC Bean生命周期打通,在Bean实例化之前被调用,进行代理对象创建等操作
    • TargetSourceCreator[] customTargetSourceCreator : 目标对象创建器数组,可以指定创建目标对象的方式
    • Set<String> targetSourceBeans : 目标对象名称缓,用于判断容器中的Bean对象是否可以被代理
    • Map<Object,Object> earlyProxyReferences : 早期代理对象引用
    • Map<Object,Class<?>> proxyTypes : 代理对象的类型
    • Map<Object,Boolean> advisedBeans : 记录IoC容器中的对象是否被可以被代理
  • BeanNameAutoProxyCreator-指定拦截器的Bean名称以及被代理对象,被代理对象支持"xxx*" or "*xxx"匹配
    • List<String> beanNames : 指定被代理对象
  • AbstractAdvisorAutoProxyCreator-通用的自动代理创建器,根据检测到的每个advisor的Bean为特定的Bean构建AOP代理,子类可以重写findCandidateAdvisors来返回一个自定义的advisor集合列表,也可以重写shouldSkip方法在自动代理过程中来排除指定的Bean
    • BeanFactoryAdvisorRetrievalHelper advisorRetirevalHelper : 和IoC容器打通,探询Bean实例是否是Advisor Bean,采用默认实现BeanFactoryAdvisorRetrievalHelperAdapter
  • InfrastructureAdvisorAutoProxyCreator-基础设施自动代理创建器,为内部组件服务,不提供给用户
    • isEligibleAdvisorBean(String beanName) : 是否是符合条件的Advisor Bean
      • BeanFactory存在,并且该Bean存在于当前容器中
      • 该Bean对应的BeanDefinition的Role为ROLE_INFRASTRUCTURE
  • DefaultAdvisorAutoProxyCreator-自动代理创建器的默认实现,可以设置advisor Bean Name前缀来进行匹配符合条件的Advisor Bean
    • String advisorBeanNamePrefix : advisor bean name 前缀字符串
  • AnnotationAwareAspectJAutoProxyFactory-与AspectJ整合的自动代理创建器实现,我们常用的注解实现流程就是基于此类对IoC容器Bean对象进行自动代理创建
    • List<Pattern> includePatterns : 和<aop:include>元素有关,如果用户在xml中使用了<aop:include>,则只有名称与include模式匹配的Aspect Bean才会被定义为Spring自动代理的切面
    • AspectJAdvisorFactory aspectJAdvisorFactory : advisor创建工厂
    • BeanFactoryAspectJAdvisorBuilder aspectJAdvisorBuilder : Advisor构建器,它里面有个核心方法-buildAspectJAdvisors,它的作用就是扫描Spring中切面,并且在该切面中搜寻符合条件的Advisor Bean来构建Advisor集合返回给上层对象。该动作是和AspectJAdvisorFactory合作完成的

12、TargetSource(目标对象)

在Spring AOP中,有关TargetSource的几个比较重要的API如下所示:

在这里插入图片描述
TargetSource使用获取AOP调用的当前目标对象,如果当前被代理对象的advisor执行链为空的时候则会通过TargetSource获取该对象,从而通过反射调用目标方法。它的几个比较重要的实现类如上图所示,下面做个简单介绍:

  • HotSwappableTargetSource-TargetSource实现,缓存本地目标对象,但允许在应用程序运行时交换目标
  • CommonsPool2TargetSource-在可配置的Apache Commons2池中保存对象的TargetSource实现。默认情况下,将创建GenericObjectPool的实例。子类可以通过重写createObjectPool()方法来更改使用的ObjectPool类型
  • PrototypeTargetSource-TargetSource实现,每次调用都会创建一个新的对象,在每次请求后都会销毁对象
  • ThreadLocalTargetSource-TargetSource实现,是池化技术的替代方案,每个线程都维护着一个目标对象的副本,通过ThreadLocal的方式存储
  • SingletonTargetSource-TargetSource实现,也是Spring AOP框架中的默认实现

四、总结

本文对Spring AOP框架中比较重要的一些接口API及其实现类做了简单的介绍,这有助于我们去很好的理解AOP框架的设计以及的整体实现原理。我们在日常开发中使用AOP的方式通常使用注解驱动或者XML驱动,下一篇我们将介绍采用注解驱动以及XML驱动开发使用方式及其背后的流程原理。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值