一个 Action class 可以限定在 Singleton 范围内吗?
Can an Action class be scoped to Singleton?
我的问题不仅是操作 类 是否可以限定为单例,而且我还想知道哪些是最佳做法。在 Struts2 和 Spring 的上下文中。控制器和模型的最佳视图范围(比如请求或会话)。
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-plugin to allow CDI to handle your actions and inject dependencies through the @Inject
注释(而不是 @Autowired
注释)
我以前用过很多Spring,然后在发现CDI和CDI插件后,我就换了,再也没有回头,所以我投了n.3
我的问题不仅是操作 类 是否可以限定为单例,而且我还想知道哪些是最佳做法。在 Struts2 和 Spring 的上下文中。控制器和模型的最佳视图范围(比如请求或会话)。
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 在不影响其性质的情况下实例化操作。
- 如果您在 Spring XML 配置文件中将一个动作声明为 bean,该动作将获得默认的 Spring 作用域,即 Singleton (
如果您在容器内 Java EE 6+ 兼容(例如,Jboss 7、Wildfly 8、TomEE 1.7、Glassfish 3+、ecc... ),上下文和依赖注入是通过 CDI 处理的。如果需要,可以使用 Struts2-CDI-plugin to allow CDI to handle your actions and inject dependencies through the
@Inject
注释(而不是@Autowired
注释)
我以前用过很多Spring,然后在发现CDI和CDI插件后,我就换了,再也没有回头,所以我投了n.3