1. 程式人生 > >Spring原始碼:AOP常用類

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