根据我的理解,Factory类和Spring DI都遵循依赖注入。我的意思是在两种情况下都使用外部实体来推动依赖。 从右吗 我的问题是,当我的意图是获取对象时,我应该在工厂类和Spring DI之间选择哪一个。假设我不想要任何其他功能,如aop,dao支持等。唯一的目的是从Factory类或Spring DI获取对象。哪一个更可取。
在某些网站上阅读此声明
与工厂类相比,DI松散耦合且侵扰性较小
但是无法得到弹簧DI如何松散耦合并且比工厂类更少侵入? 在这两种情况下,我们都必须在核心程序中插入某种get对象代码。
答案 0 :(得分:3)
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;
....
}
在第二个代码示例中,Spring(或您使用的任何代码)将为您注入适当的DAO实例。您已将对要使用的组件的控制权移至更高级别。因此,IoC和DI可以实现,IoC 提升松散耦合,因为在组件定义(即接口)中,您只需指定行为。
换句话说,松散耦合不需要IoC和DI;你也可以与工厂松耦合
MyServiceImpl extends MyService {
public dao1
public dao2;
MyServiceImpl(){
dao1 = DaoFactory.getDao1();
...
}
....
}
此处您的服务仍然只依赖于DAO 定义并且您使用工厂来获取实现。需要注意的是,您的服务现在已经与工厂相连。如果你想要的话,可以通过将Factory传递给构造函数来使它更松散。
另外,不要忘记Spring提供了其他有用的功能,比如它的事务管理。这是非常有帮助的,即使你说你的应用程序,你不需要它。
答案 1 :(得分:0)
但无法得到弹簧DI如何松散耦合并且不那么干扰 比工厂类?在这两种情况下我们都要插入一些 在我们的核心程序中获取目标代码。
Spring使其不那么具有侵入性,因为它使用反射来自动“注入/创建”依赖项。因此,您的代码不需要引用工厂。
Spring通常用于“类似Singleton”的对象创建。人们通常使用自定义工厂来暂时抛弃对象创建(如请求对象)。 事实上,您经常会使Spring创建并注入您的自定义工厂(即工厂的工厂)。