1. 程式人生 > >AOP代理對象生成

AOP代理對象生成

rabl 一個數 null bstr 系統 cot stp ioc warn

AOP(Aspect-OrientedProgramming,面向方面編程)是OOP(Object-Oriented Programing,面向對象編程)的良好補充與完善,後者側重於解決

從上到下的存在明顯層次邏輯關系的問題,而前者則側重於由左至右的水平散布的無明顯邏輯關系但具備相同行為的問題。AOP抽象的是相同的行為而非

關聯的行為,用於提供通用服務支持,而非業務邏輯處理,其核心思想是“將應用程序中的商業邏輯同對其提供支持的通用服務進行分離。

AOP植入有多種不同方式,主要分為以下三種方式:

  1. 編譯期植入
  2. 類裝載期植入
  3. 動態代理植入

Spring中AOP具體的配置過程,可通過以下途徑:

  1. 配置ProxyFactoryBean,顯式設置advisors, advice, target等
  2. 配置AutoProxyCreator,使用定義bean的方式不變,但是從容器中獲得的是代理對象

技術分享圖片

最頂層是ProxyConfig是一個數據,這個數據基類為ProxyFactoryBean這樣的子類提供了配置屬性;

AdvisedSupport的封裝了Aop對通知和通知器的相關操作,這些操作對於不同的Aop的代理對象的生成都是一樣的,

但對於具體的Aop代理對象的創建,AdvisedSupport把它交給它的子類們去完成;對於ProxyCreatorSupport,

可以將它看成是其子類創建Aop代理對象的一個輔助類;具體的Aop代理對象的生成,根據不同的需要,

分別由ProxyFactoryBean、ProxyFactory、AspectJProxyFactory來完成

技術分享圖片

AbstractAutoProxyCreator 實現了BeanPostProcessor,當系統比較復雜或者中需要進行aop織入的bean較多時,

簡單采用ProxyFacotryBean無疑會增加很多工作量,同時由於要從ProxyFactoryBean獲得代理對象,也會使應用

和Spring之間的耦合度增加,這樣的情況下,自動Aop代理的方式就能發揮它巨大的優勢了。

AOP對象的生成

1.ProxyFactory是怎樣得到代理類的

public Object getProxy() {
        
return createAopProxy().getProxy();
}
protected final synchronized AopProxy createAopProxy() { if (!this.active) { activate(); } return getAopProxyFactory().createAopProxy(this); }

2.ProxyFactoryBean是怎樣獲得代理類的

ProxyFactoryBean是在Spring IoC環境中。

技術分享圖片

    @Override
    public Object getObject() throws BeansException {
        initializeAdvisorChain(); //初始化通知器
        if (isSingleton()) {
            return getSingletonInstance();//依據定義生成單例的Proxy
        }
        else {
            if (this.targetName == null) {
                logger.warn("Using non-singleton proxies with singleton targets is often undesirable. " +
                        "Enable prototype proxies by setting the ‘targetName‘ property.");
            }
            return newPrototypeInstance(); //這裏依據定義生成prototype的Proxy
        }
    }

參考:

網易樂得技術團隊:Spring-SpringMVC父子容器&AOP使用總結

spring aop 代理對象生成

AOP代理對象生成