簡體   English   中英

spring 作用域代理 bean

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM