[英]spring scoped proxy bean
有人可以解釋一下 spring @ScopedProxy
注釋的用法嗎? 我認為它與會話范圍的 bean 有關,但我不太確定是什么。
在我使用范圍時,我使用了沒有@ScopedProxy
注釋(或沒有 aop 范圍代理)的會話范圍 bean,所以我真的很確定如何正確使用它。
spring 文檔的第 3.4.4.5 節很好地解釋了它:
(請注意,以下“userPreferences”bean 定義不完整):
<!-- an HTTP Session-scoped bean -->
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>
<!-- a singleton-scoped bean -->
<bean id="userManager" class="com.foo.UserManager">
<property name="userPreferences" ref="userPreferences"/>
</bean>
從上面的配置可以明顯看出,單例 bean 'userManager' 被注入了對 HTTP 會話范圍的 bean 'userPreferences' 的引用。 這里的重點是'userManager' bean 是一個單例......它會在每個容器中被實例化一次,並且它的依賴項(在這種情況下只有一個,'userPreferences' bean)也只會被注入(一次! ) 。
這意味着“userManager”將(概念上)只對完全相同的“userPreferences”對象進行操作,即最初注入的對象。
當您將 HTTP 會話范圍的 bean 作為依賴項注入到協作對象中時(通常),這不是您想要的。 相反,我們想要的是每個容器有一個“userManager”對象,然后,在 HTTP Session 的生命周期中,我們想要查看和使用特定於所述 HTTP Session 的“userPreferences”對象。
相反,您需要的是注入某種對象,該對象公開與 UserPreferences 類完全相同的公共接口(理想情況下是一個 UserPreferences 實例的對象),並且該對象足夠智能,能夠離開並獲取真正的 UserPreferences 對象從我們選擇的任何底層范圍機制(HTTP 請求、會話等)。 然后我們可以安全地將這個代理對象注入到“userManager”bean 中,它不會意識到它持有的 UserPreferences 引用是一個proxy 。
在我們的例子中,當 UserManager 實例調用依賴注入的 UserPreferences 對象上的一個方法時,它實際上會調用代理上的一個方法......然后代理將關閉並從中獲取真正的 UserPreferences 對象(在這種情況下) HTTP 會話,並將方法調用委托給檢索到的真實 UserPreferences 對象。
這就是為什么在將請求范圍、會話范圍和全局會話范圍的 bean 注入協作對象時需要以下正確且完整的配置的原因:
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session">
<aop:scoped-proxy/>
</bean>
<bean id="userManager" class="com.foo.UserManager">
<property name="userPreferences" ref="userPreferences"/>
</bean>
在嘗試了此處指定的各種不同選項和 spring 文檔后,由於某種原因,我發現 Spring MVC 是一種奇怪的自動裝配控制器,當您使用 @Controller 注釋並且您的 web 應用程序中有多個這樣的控制器時。 修改注解為@RestController (value="UniqueControllerv1"),問題解決。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.