工厂级vs Spring DI

时间:2011-08-28 15:42:37

标签: java spring design-patterns dependency-injection

根据我的理解,Factory类和Spring DI都遵循依赖注入。我的意思是在两种情况下都使用外部实体来推动依赖。 从右吗 我的问题是,当我的意图是获取对象时,我应该在工厂类和Spring DI之间选择哪一个。假设我不想要任何其他功能,如aop,dao支持等。唯一的目的是从Factory类或Spring DI获取对象。哪一个更可取。

在某些网站上阅读此声明

与工厂类相比,DI松散耦合且侵扰性较小

但是无法得到弹簧DI如何松散耦合并且比工厂类更少侵入? 在这两种情况下,我们都必须在核心程序中插入某种get对象代码。

2 个答案:

答案 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创建并注入您的自定义工厂(即工厂的工厂)。