java - Action 类的范围可以限定为 Singleton 吗?

标签 java spring spring-mvc struts2 cdi

我的问题不仅是操作类是否可以限定为单例,而且我还想知道哪些是最佳实践。两者都在 Struts2 和 Spring 的上下文中。对于 Controller 和模型来说,VIEW 的最佳范围(例如请求或 session )。

最佳答案

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

  2. 如果你使用Spring通过Struts2-Spring-plugin来处理它们,有多个级别的使用:

    • 您可以让 Struts 容器实例化它们,并通过 Spring 处理它们以进行依赖注入(inject),或者
    • 你可以让 Spring 接管控制权并完全负责每个 Action 的整个生命周期。
      在第二种情况下:
      • 如果您在 Spring XML 配置文件中将某个操作声明为 bean,则该操作将获得默认的 Spring 作用域,即 Singleton (scope="singleton")。这是危险的、无用的,而且 99.99% 的时候都不是你想要的,因为你将失去框架功能的基本部分,操作将变成某种 servlet、线程不安全,并且会出现许多问题;
      • 为了防止这种情况,您可以将 scope="prototype" 放在 bean 声明中,这将使 Spring 实例化该操作而不影响其性质。
  3. 如果您位于兼容 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/

相关文章:

java - 在独立的 java Spring spring 应用程序(非 web 应用程序,无容器)中摆脱 getBean

java - Maven 多模块项目结构化问题

java - 在 SWT 中单击另一个按钮时处置 SelectionListener

java - JSP 和服务器端延迟

Java泛型?扩展克拉兹

java - 通过 Spring SecurityContextHolder 更新权限

java - 如何在 Spring Boot 中获取 Dispatcher Servlet Initializer 功能

java - 如何避免在 HttpServletRequest 中过滤文件名

java - java字符串分割方法

java - 如果类具有参数化构造函数,为什么 Java 不提供默认构造函数?