【问题标题】:Use of @Scope annotation with Spring Controller在 Spring Controller 中使用 @Scope 注解
【发布时间】:2016-03-18 22:18:02
【问题描述】:

我正在开发一个基于 Struts 1.x 的项目,将其转换为 Spring 4。我访问了许多教程站点并阅读了 Spring 4 教程,但没有人在教程应用程序中使用 @Scope 注释和 @Controller .我的问题是:

1) 必须使用@Scope 属性吗?

2) 如果我们不使用怎么办?

3) 将@Scope@Controller 一起使用是一种好习惯吗?

我们还在服务器启动时读取了一个属性文件并将其存储到属性类中。我正在阅读 DAOImpl 类中的一些属性(注释为 @Repository)。如果我将@Scope 属性与Controller 和Repository 一起使用,则它返回值,否则返回NullPointerException。为什么会出现这种行为?

【问题讨论】:

  • 你认为@Scope 会做什么?
  • OrangDog 据我所知@Scope 允许我们在不同的范围内初始化对象。像单例、原型、请求和会话
  • 你能发布那个 DaoImplCode 吗?
  • 为什么需要一个控制器类的多个实例?
  • 我们使用@Autowired 来实例化DAOImpl objectin control。所以只是想确保它不会引起歧义

标签: spring spring-mvc spring-4


【解决方案1】:

1) 必须使用@Scope 属性吗?

没有。如果您想要默认值 ("singleton"),则无需指定。

2) 如果我们不使用怎么办?

那么您的应用程序将只创建一个 bean 实例。

3) 将@Scope@Controller 一起使用是一种好习惯吗?

没有。应用程序拥有多个控制器类(或存储库)的实例是没有意义的。如果您需要同时使用这两个注解,那么您的类建模就不是很好。

为什么会这样?

因为如果目标 bean 未在该范围内构建(例如,尝试将请求范围的 bean 注入在请求上下文之外创建的 bean),则上下文无法创建要注入的范围 bean。

要解决这个问题,您需要使用作用域代理,通过设置proxyMode

但是,在您的特定情况下,解决方案是您实际上不需要非默认范围。

【讨论】:

    【解决方案2】:

    @Scope- 不强制与@Controller 一起使用,除非并且直到您根据您的要求需要一个。 @Scope 定义了 bean 的范围,默认是它的单例。 还有,Property Class 应该由 Spring 来管理,否则会给你一个异常。

    【讨论】:

      猜你喜欢
      • 2011-07-22
      • 1970-01-01
      • 2014-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      • 2011-08-04
      相关资源
      最近更新 更多