代理模式在Spring原始碼中的應用

2020-10-13 01:01:15
我們在使用 Spring AOP 時,需要先設定好 ProxyFactoryBean,然後通過 ac.getBean(bean id) 來獲取 ProxyFactoryBean 代理的物件。而 ProxyFactoryBean 類使用 ProxyFactoryBean.getObject() 方法獲取返回的物件,即代理物件。

下面先看 ProxyFactoryBean 類中的核心方法 getObject(),原始碼如下:
public Object getObject() throws BeansException {
    initializeAdvisorChain();
    if (isSingleton()) {
        return getSingletonInstance();
    }
    else {
        if (this.targetName == null) {
            logger.info("Using non-singleton proxies with singleton targets is often undesirable. " +
                    "Enable prototype proxies by setting the 'targetName' property.");
        }
        return newPrototypeInstance();
    }
}
在 getObject() 方法中,主要呼叫 getSingletonInstance() 和 newPrototypeInstance() 方法。

在 Spring 的設定中,如果不做任何設定,則 Spring 代理生成的 Bean 都是單例物件。如果修改 scope,則每次都建立一個新的原型物件。newPrototypeInstance() 裡的邏輯比較複雜,教學後面會詳細講解,這裡簡單瞭解即可。

Spring 使用動態代理實現 AOP 時有兩個非常重要的類,即 JdkDynamicAopProxy 類和 CglibAopProxy 類,其類圖如下: