Spring - 使用new关键字是一个不良实践吗?

6

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


你当然可以使用 new 来创建对象,但是在这种情况下 Spring 就不会向这些对象注入任何依赖项,因为 Spring IoC 不知道该对象是如何创建的。 - Ivan
以POJOs为例。Spring不需要知道它们。事实上,遵循Bob叔叔的建议,您的业务逻辑(因此也包括POJOs)不应该知道使用了Spring(“保持框架与业务逻辑相隔离”)。如果我们谈到REST端点、控制器等,则应通过DI进行连接。 - Turing85
@Turing85,在Spring中,实际上几乎所有的对象都是POJO。 - k13i
1
这不正确。Spring 在检测和配置 bean 时严重依赖注解。POJO 的定义是代码中没有任何框架的迹象。 - Sharon Ben Asher
这取决于对象。依赖注入对于大型对象非常有用,但如果是小型对象,则不值得花费精力,只需使用new关键字即可。 - Ambidextrous
3个回答

8
您希望Spring为以下类创建bean:
  • 您希望/需要将实例注入到其他bean中
  • 您需要在它们自己的实例中注入bean(或依赖项)。
  • 您希望它们受益于Spring功能(实例化管理、事务管理、代理类Spring empowered,如Repository/Interceptor等)。
服务、控制器或拦截器是其中的示例。
例如,控制器可能需要注入服务或拦截器。同样,您不想通过为每个类实现单例模式来处理这些类的实例化。这可能会出错并且需要样板代码。因此,您希望所有这些类都是由Spring管理的bean。
但是,您不希望Spring为以下类创建bean:
  • 您不希望/需要将实例注入到其他bean中
  • 您不需要在其自己的实例中注入bean(或依赖项)
  • 您不需要它们受益于Spring功能
实体、DTO、值对象是其中的示例。
例如,实体从不需要作为依赖项注入到另一个实体或服务中,因为实体不是在容器启动时创建的,而是通常在方法内部创建,并且具有限定于方法生命周期的范围。同样,您不需要Spring创建在方法生命周期内的实例。新运算符可以很好地完成这项工作。因此,将它们定义为bean实例没有意义,甚至看起来是违反直觉的。

1

使用 new 并不是什么坏事,你只是将使用 new 的责任交给了 IoC 容器。IoC 将知道您注册的所有类。在使用框架时,更重要的是思考应用程序的架构,因为框架会让坏的设计变得和好的设计一样容易实现。

如果您不需要多个类的实现,请使用 new。

如果您认为可能需要在实现之间切换,请考虑应用程序的设计,并找到适当的注入点,以便重构不会成为负担。

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

并非应用程序的每一个角落都需要高度可配置。这会导致过度设计和难以维护的代码。


0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接