2015-12-02 24 views
1

我的問題不僅在於動作類的範圍可以是singleton,而且我也想知道哪些是最佳做法。在Struts2和Spring的上下文中。對於控制器和模型,VIEW的最佳範圍(比如請求或會話)。一個Action類可以限定爲Singleton嗎?

+1

請分享你的想法到目前爲止?你一直在研究和發現什麼?如果有什麼疑問,你的結論是什麼?......或者你沒有,這是你考試的問題? – Mil4n

+0

Spring提供單例的默認範圍。然而,當我們在spring中使用struts時,創建動作類singleton是一個好主意,因爲如果我們這樣做,我將獲得bean的相同實例。任何人都可以解釋我「Singleton作用域應該與無狀態會話Bean和EJB有狀態會話bean的原型範圍一起使用」動作DAO,DTO,BS和攔截器的類似邏輯。 –

+1

如果對於每個用戶請求你是服務器相同的操作類(單例),它必須是無狀態的,否則你所有的用戶將共享每個其他狀態! 如果你正在使用原型範圍,Spring將爲每個請求提供bean的新實例。 http://docs.spring.io/spring/docs/3.1.0.M2/spring-framework-reference/html/beans.html#beans-factory-scopes-singleton – Mil4n

回答

1
  1. Struts2操作由Struts容器管理。它們是ThreadLocal,因此每個請求都有其自己的線程安全副本。

  2. 如果你使用Spring通過Struts2-Spring-plugin來處理它們,也有使用的多個層次:

    • 可以讓Struts的容器實例化它們,並處理它們通過彈簧的依賴注入,或
    • 你可以讓Spring接管控制並對每個Action的整個生命週期負全責。
      在第二種情況下:
      • ,如果你宣佈一個行動,在Spring XML配置文件中的bean時,動作會得到默認的春天範圍,即辛格爾頓(scope="singleton")。這是危險的,無用的,99.99%的時間不是你想要的,因爲你將失去框架能力的基本部分,行動將變成種類的servlet,線程UNsafe,並且會出現許多問題;
      • 爲了防止這種情況發生,您可以將scope="prototype"放入bean聲明中,這將讓Spring在不影響其性質的情況下實例化該操作。
  3. 如果你是一個容器的Java EE兼容6+(例如,Jboss的7,8 Wildfly,TomEE 1.7,Glassfish的3+,ECC ...),上下文和依賴內注射通過CDI處理。如果你願意,你可以使用Struts2-CDI-plugin,讓CDI來處理你的行動,並通過@Inject註釋注入依賴(而不是@Autowired之一)

我用過Spring很多過去

,再經過發現CDI和CDI插件,我已經切換了,從不回頭看,所以我投票支持n.3

相關問題