Spring DI 提倡松散耦合的代码,因为 Spring 容器会根据配置注入您的依赖项。如果您要注入接口实现,则无需更改代码即可更改注入的特定实现,除非您考虑配置代码,很多人都会这样做。
如果您使用工厂创建配置的对象供其余代码使用,那么您就是在编写代码来创建对象、配置它们等。如果您想更改工厂返回的内容,则必须进行更改实际代码,有些人会认为这是一个更具侵入性的更改。
Spring 通常用于配置应用程序的各个层如何连接在一起。例如,X 服务采用这样那样的 DAO 实现。那是应用程序级别的组织。假设您有一个场景,想要为列表中的每一行创建一个按钮——在这种情况下,您可以使用工厂来创建按钮。此方案基于运行时情况,其中 GUI 具有您无法预先配置的不同元素(因为它基于数据),因此 DI 在这里意义不大。
编辑 - 根据您的评论问题,我认为这里的主要观点是您必须考虑的是 Spring 也是一个 控制反转 容器。这意味着您无需对应用程序中的哪些组件进行编程。如果没有 IoC,你可能会做类似的事情
MyServiceImpl extends MyService {
Dao1 = new Dao1Impl(); // you programmatically configure which components go in here
Dao2 = new Dao2Impl();
....
}
相反,您会做类似的事情
MyServiceImpl extends MyService {
public Dao1; // you haven't specified which components, only interfaces
public Dao2;
....
}
在第二个代码示例中,Spring(或您使用的任何东西)将为您注入适当的 DAO 实例。您已将使用哪些组件的控制移至更高级别。所以 IoC 和 DI 齐头并进,IoC 促进松散耦合,因为在您的组件定义(即接口)中您只指定行为。
换句话说,IoC 和 DI 不是松散耦合所必需的;您也可以与工厂进行松散耦合
MyServiceImpl extends MyService {
public dao1
public dao2;
MyServiceImpl(){
dao1 = DaoFactory.getDao1();
...
}
....
}
这里您的服务仍然只依赖于 DAO定义,并且您使用工厂来获取实现。需要注意的是,您的服务现在已与工厂耦合。如果需要,您可以通过将工厂传递给构造函数来使其更加松散......
另外,别忘了 Spring 提供了其他有用的功能,比如它的事务管理。这非常有用,即使您说您的应用程序不需要它。