Action类可以限定为Singleton吗?

时间:2015-12-02 19:28:23

标签: java spring spring-mvc struts2 cdi

我的问题不仅仅是动作类可以限定为单例,而且我还想知道哪些是最佳实践。两者都在Struts2和Spring的背景下。控制器和模型的最佳VIEW范围(比如请求或会话)。

1 个答案:

答案 0 :(得分:1)

  1. Struts2操作由Struts容器管理。它们是ThreadLocal,因此每个请求都有自己的Action的线程安全副本。

  2. 如果您使用Spring通过Struts2-Spring-plugin处理它们,则有多种使用级别:

    • 你可以让Struts容器实例化它们,并通过Spring处理它们以进行依赖注入,或者
    • 你可以让Spring接管并完全负责每个Action的整个生命周期。
      在第二种情况下:
      • 如果在Spring XML配置文件中将操作声明为bean,则操作将获得默认的Spring范围,即Singleton(scope="singleton")。这是危险的,无用的,99.99%的时间不是你想要的,因为你将失去框架能力的一个基本部分,行动将变成一种类型的servlet,线程 - UNsafe,并且会出现许多问题;
      • 为了防止这种情况,您可以将scope="prototype"放在bean声明中,这样可以让Spring在不影响其性质的情况下实例化该行为。
  3. 如果您在符合Java EE 6+标准的容器内(例如,Jboss 7,Wildfly 8,TomEE 1.7,Glassfish 3 +,ecc ......),则通过CDI处理上下文和依赖注入。如果需要,您可以使用Struts2-CDI-plugin来允许CDI处理您的操作并通过@Inject注释(而不是@Autowired注释)注入依赖关系

  4. 我过去经常使用Spring,然后在发现CDI和CDI插件后,我已经切换并且从未回头,所以我投票给n.3