Spring源码:AOP常用类

类简介

1.切点类
  • **AspectJExpressionPointcut类:**Pointcut接口的实现,该实现使用AspectJ weaver计算切入点表达式的切入点

  • **InstantiationModelAwarePointcutAdvisorImpl类:**AspectJPointcutAdvisor的内部实现。该类将为每个目标方法提供这个advisor的一个实例

    所有的增强都是由Advisor的实现类InstantiationModelAwarePointcutAdvisorImpl统一封装

  • **AopNamespaceUtils抽象类:**用于处理“aop”命名空间标签的内部使用的自动代理创建者注册的工具类

  • **AopConfigUtils抽象类:**处理AOP自动代理创建者注册的工具类

  • **AbstractAutoProxyCreator抽象类:**实现了BeanPostProcessor,用于将每个符合条件的bean包装为AOP代理,在调用bean本身之前委托给指定的拦截器。

  • **AbstractAdvisorAutoProxyCreator抽象类:**AbstractAutoProxyCreator的子类,通用自动代理创建器,它基于检测到的每个bean的顾问为特定bean构建AOP代理。

    1. 子类必须实现抽象findCandidateAdvisors()方法,以返回应用于任何对象的顾问列表。
    2. 子类也可以覆盖继承的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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring AOP中,拦截器责任链处理过程是指当目标方法被多个通知匹配到时,Spring通过引入拦截器链来保证每个通知的正常执行。拦截器链是由一系列的拦截器组成的,每个拦截器都负责在目标方法的前后执行特定的逻辑。 在源码中,拦截器责任链的处理过程主要通过MethodInvocation接口来实现。MethodInvocation接口提供了proceed()方法,用于执行拦截器链中下一个拦截器的逻辑。当调用proceed()方法时,会按照拦截器链的顺序依次执行每个拦截器的逻辑,直到达到链的末尾或者某个拦截器决定终止链的执行。 在拦截器责任链处理过程中,每个拦截器可以在目标方法的调用前后执行自定义的逻辑。拦截器可以对方法的参数进行检查、修改方法的返回值,或者在方法执行前后记录日志等操作。通过拦截器责任链的处理,Spring AOP能够实现面向切面编程的功能。 需要注意的是,拦截器链的执行顺序是根据拦截器的配置顺序确定的。在Spring的配置文件中,可以通过配置拦截器的顺序来控制拦截器链的执行顺序。这样可以确保每个拦截器按照预期的顺序执行,从而达到期望的功能效果。 总结起来,Spring AOP源码的拦截器责任链处理过程主要通过MethodInvocation接口实现,它通过调用proceed()方法来依次执行拦截器链中每个拦截器的逻辑。拦截器链的执行顺序可以通过配置文件来控制,从而实现面向切面编程的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Spring AOP源码:拦截器责任链处理过程](https://blog.csdn.net/weixin_45031612/article/details/128806966)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Spring AOP 自动代理源码 DefaultAdvisorAutoProxyCreator](https://download.csdn.net/download/weixin_38530536/14854229)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [【SpringSpring AOP 源码分析-拦截器链的执行过程(四)](https://blog.csdn.net/qq_46514118/article/details/121912507)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bboyzqh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值