Spring DI提倡松散耦合的代码,因为Spring容器会根据配置注入您的依赖关系。如果您正在注入接口实现,则不必更改代码以更改注入哪个特定实现,除非您考虑配置代码,而这些代码很多。
如果您使用Factory来创建其余代码使用的配置对象,那么您正在编写代码来创建对象,配置它们等。如果要更改工厂返回的内容,则必须更改实际的代码,这有些人会争辩是更多的侵入更改。
通常使用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;
....
}
在第二个代码示例,弹簧(或任何你使用)将注入适当的DAO实例为您服务。您已将控制哪些组件用于更高级别。因此,IoC和DI交手,IoC 促进松散耦合,因为在组件定义(即接口)中,您只能指定行为。
换句话说,IoC和DI不是松耦合所必需的;你可以有松耦合与工厂太
MyServiceImpl extends MyService {
public dao1
public dao2;
MyServiceImpl(){
dao1 = DaoFactory.getDao1();
...
}
....
}
在这里为您服务仍然只取决于DAO 定义并使用工厂来获得实现。需要注意的是,您的服务现在已连接到工厂。如果你愿意的话,你可以通过将工厂传递给你的构造函数来使它变得更加松散。
另外,别忘了Spring提供其他有用的功能,比如它的事务管理。这是非常有用的,即使你说你的应用程序,你不需要它。
“只是为了得到物体”?真?对他们没有行为?然后,执行'new Object()'。 (告诉我们更多关于发生了什么的事情,以便我们知道如何提出有用的建议,并且Spring广泛使用Factory模式等等。) –