簡體   English   中英

注入 singleton bean 時,Spring 的 @RequestScope 會自動處理代理嗎?

[英]Does Spring's @RequestScope automatically handle proxying when injected in singleton beans?

我正在使用 Java8/Spring Boot 2 應用程序。 我想將一個請求范圍的 bean 注入到一個 singleton bean 中。 官方文檔強調應使用代理或 ObjectFactory/Provider 來確保在運行時始終在 singleton bean 中獲得正確作用域的 bean。 但是,@RequestScope 注釋似乎“自動”設置了某種代理,如該問題的答案中所述。

我現在想知道以下三個實現是否實際上相同,哪個是首選?

方法 1:顯式使用 objectFactory<>

@Component
@RequestScope
public class MyRequestScopedBean{...}

@Component
public class MySingletonBean{
    @Autowired
    private ObjectFactory<MyRequestScopedBean> myRequestScopedBean
}

方法 2:正常注入,假設請求作用域 bean 被自動代理?

@Component
@RequestScope
public class MyRequestScopedBean{...}

@Component
public class MySingletonBean{
    @Autowired
    private MyRequestScopedBean myRequestScopedBean
}

方法 3:使用 @Configuration 和 @Bean 因為我不知道它們的區別並且我擔心它們的行為不同。

@Comfiguration
public class myBeanConfig{
   @Bean
   @RequestScope
   public MyRequestScopedBean getRequestScopedBean(){return new MyRequestScopedBean();}

}

@Component
public class MySingletonBean{
    @Autowired
    private MyRequestScopedBean myRequestScopedBean
}

我更喜歡方法 2,因為它簡潔並自動處理范圍/代理。

如果我的 @Autowired bean 被聲明為final字段,答案會改變嗎? 我擔心將其設置為 final 會以某種方式阻止代理在每個請求中正確獲取新 bean。

是的,使用@RequestScope代理已經默認激活,效果完全等於@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyModel = ScopedProxyMode.TARGET_CLASS)

我一直在我的項目中使用第二種方法,到目前為止我沒有問題。 文檔中沒有提到它也必須使用ObjectFactory 不要想太多。 如果遇到任何問題,您將在控制台中非常清楚地看到錯誤。 在你遇到實際問題之前沒有理由害怕。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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