Action类可以限定为Singleton吗?

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

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

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

    • 你可以让Struts容器实例化它们,并通过Spring为dependency injection处理它们,或者
    • 你可以让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处理上下文和dependency injection。 如果需要,您可以使用Struts2-CDI插件来允许CDI处理您的操作并通过@Inject注释(而不是@Autowired注释)注入依赖项

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