我們在使用 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 類,其類圖如下: