动作类的作用域可以限制为Singleton吗?
问题内容:
我的问题不仅是将动作类的作用域限定为单例,而且我还想知道哪种是最佳实践。在Struts2和Spring的上下文中。控制器和模型的VIEW最佳范围(例如请求或会话)。
问题答案:
-
Struts2动作由Struts容器管理。它们是ThreadLocal,因此每个请求都有其自己的Action线程安全副本。
-
如果使用Spring通过Struts2-Spring-plugin处理它们,则有多种用法:
- 您可以让Struts容器实例化它们,并通过Spring处理它们以进行依赖注入,或者
-
您可以让Spring接管控制权,并对每个Action的整个生命周期负全部责任。
在第二种情况下: -
如果您在Spring XML配置文件中将动作声明为Bean,则该动作将获得默认的Spring范围,即Singleton(
scope="singleton"
)。这是危险的,无用的,并且99.99%的时间不是您想要的,因为您将失去框架功能的基本组成部分,因此操作将变成某种servlet,线程不安全,并且会出现许多问题; - 为了防止这种情况,您可以
scope="prototype"
在bean声明中放入,这将使Spring实例化该动作而不影响其性质。 - 如果您在兼容Java EE 6+的容器内(例如,Jboss 7,Wildfly 8,TomEE 1.7,Glassfish 3 +,ecc …),则通过CDI处理上下文和依赖项注入。如果你愿意,你可以使用Struts2的-CDI-插件允许CDI通过处理您的行为而注入依赖
@Inject
注释(而不是@Autowired
一个)
过去我经常使用Spring,后来发现CDI和CDI插件后,我切换了,再也没有回头,所以我投票赞成n.3