2015-12-02 61 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

相关问题