2015-10-13 58 views
0

我的印象是每當一個類實現一個接口,就會創建基於JDK的代理。基於CGLib的代理是通過類實現接口創建的

我有一個bean,它實現了與prototype scope的接口,這個接口被注入到一個具有singleton範圍的bean中。我嘗試使用proxyMode = ScopedProxyMode.INTERFACES創建JDK代理是正確的,但是當我厭倦proxyMode = ScopedProxyMode.TARGET_CLASS時,即使我的bean實現了一個接口,也會創建基於CGLIB的代理。

proxyMode = ScopedProxyMode.TARGET_CLASS 

proxyMode = ScopedProxyMode.INTERFACES 

它們之間有什麼區別,會發生什麼?何時使用哪一個?

我還有一個問題是,將原型bean注入單例bean的正確方法是什麼?

+0

這就是你告訴框架要做的是總是創建基於類的代理以及基於cglib的代理。 –

回答

2

通常,在原型範圍的bean被注入到單例範圍的bean中的場景中不需要代理。

reference documentation狀態:

你並不需要結合與和作用域爲singleton或prototype的bean使用<aop:scoped-proxy/>

沒有代理髮生了什麼?

當Spring上下文被創建並且singleton bean實例化時,原型bean的新實例被創建並注入到單例中。現在,我們的單例的每個調用都使用原型的相同實例。

爲什麼你需要代理?

也許你想改變默認的行爲併爲每個單身bean的調用創建一個新的原型bean實例。通過代理,單身bean將爲所有調用保留相同的代理實例。通過每次調用,代理將從Spring上下文中獲取新的原型bean實例。

代理模式

代理模式是自描述的。見ScopeProxyMode的Javadoc:

  • ScopeProxyMode.INTERFACES - 創建一個JDK動態代理實現由類目標對象暴露的所有接口。
  • ScopeProxyMode.TARGET_CLASS - 創建一個基於類的代理(使用CGLIB)。

單例bean是否依賴於原型bean實現的接口?使用ScopeProxyMode.INTERFACES。否則,請使用ScopeProxyMode.TARGET_CLASS

A method injection是獲得與代理相同行爲的替代方法。

+0

你覺得答案有幫助嗎? –