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