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代理。
- 子類必須實現抽象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