Spring - 使用 new 是一种不好的做法吗?

Spring - is using new a bad practice?

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

您希望 Spring 为 类 创建 beans :

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

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

管理的 beans

但是您不想 Spring 为 类 创建 beans :

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

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

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

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

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

使用 new 并不坏,您只是让 IoC 容器负责在后台使用 new。 IoC 将了解您向其注册的所有 classes。使用框架时,考虑应用程序架构更为重要,因为框架使糟糕的设计与好的设计一样容易实现。

如果您不需要 class 的多个实现,则使用新的。

如果您认为可能需要在实现之间切换,请考虑您的应用程序设计并找到合适的注入点,这样重构就不会浪费时间。

如果您需要 class 的多个实现,请使用工厂或 DI 框架等设计模式。

并非应用程序的每个角落都需要高度可配置。这就是导致 over-engineered 和难以维护代码的原因。