【问题标题】:Spring - is using new a bad practice?Spring - 使用 new 是一种不好的做法吗?
【发布时间】:2018-10-03 23:06:52
【问题描述】:

手动创建对象,即使用new 运算符而不是注册Spring bean 并使用依赖注入被认为是不好的做法?我的意思是,Spring IoC 容器是否必须知道应用程序中的所有对象?如果是这样,为什么?

【问题讨论】:

  • 您当然可以使用new 创建对象。但在这种情况下,Spring 不会向这些对象注入任何依赖项,因为 Spring IoC 不会知道该对象已创建。
  • 以 POJO 为例。 Spring 不需要知道它们。事实上,按照 Bob 叔叔的建议,您的业务逻辑(以及您的 POJO)应该不知道使用了 Spring(“与框架保持一定距离”)。如果我们谈论 REST 端点、控制器……这些应该通过 DI 连接。
  • @Turing85,在 Spring 实际上几乎所有对象都是 POJO
  • 这是不正确的。 Spring 严重依赖注解来检测和配置 bean。 POJO 根据定义在代码上没有任何框架迹象
  • 这取决于对象。依赖注入对重对象有好处,但如果是小对象,则不值得努力,只需使用 new 关键字即可。

标签: java spring dependency-injection inversion-of-control new-operator


【解决方案1】:

您希望 Spring 为以下类创建 bean

  • 您想要/需要在其他 bean 中注入实例
  • 您需要在它们自己的实例中注入 bean(或依赖项)。
  • 您希望他们受益于 Spring 功能(实例化管理、事务管理、Spring 授权的代理类,例如 Repository/Interceptor 等等......)

服务、控制器或拦截器就是其中的例子。
例如,控制器可能需要注入服务或拦截器。
此外,您不想通过为每个类实现单例模式来处理这些类的实例化。这可能容易出错并且需要样板代码。
所以你希望所有这些类都是由 Spring 管理的 bean。

但您不想 Spring 为以下类创建 bean

  • 您不想/不需要在其他 bean 中注入实例
  • 您无需在自己的实例中注入 bean(或 rdependencies)
  • 您不需要它们从 Spring 功能中受益

实体、DTO、值对象就是其中的例子。

例如,一个实体永远不需要作为依赖项注入到另一个实体或服务中,因为实体不是在容器启动时创建的,而是通常在方法内部创建的,并且范围仅限于方法的生命周期。
以及您不需要 Spring 来创建生命周期是一种方法的实例。 new 运算符做得很好。
因此,将它们定义为 bean 实例毫无意义,甚至显得违反直觉。

【讨论】:

    【解决方案2】:

    Spring 实现了依赖注入模式。您应该在 spring 的容器中注入将在其他类中使用的 bean,作为能够工作的依赖项。通常会注入实现接口的类,因此如果您更改实现,使用该接口的类不会知道更改。

    我建议你阅读 post 关于 Martin Fowler 的依赖注入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-30
      • 1970-01-01
      • 2017-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多