2011-08-28 29 views
4

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

一些网站阅读本声明

DI松耦合和较少干扰相比,工厂类

,但不能得到怎样春天DI松散耦合,比工厂类侵扰程度较低? 在这两种情况下,我们都必须在我们的核心程序中插入某种获取对象代码。

+0

“只是为了得到物体”?真?对他们没有行为?然后,执行'new Object()'。 (告诉我们更多关于发生了什么的事情,以便我们知道如何提出有用的建议,并且Spring广泛使用Factory模式等等。) –

回答

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; 
    .... 
} 

在第二个代码示例,弹簧(或任何你使用)将注入适当的DAO实例为您服务。您已将控制哪些组件用于更高级别。因此,IoC和DI交手,IoC 促进松散耦合,因为在组件定义(即接口)中,您只能指定行为。

换句话说,IoC和DI不是松耦合所必需的;你可以有松耦合与工厂太

MyServiceImpl extends MyService { 
    public dao1 
    public dao2; 

    MyServiceImpl(){ 
     dao1 = DaoFactory.getDao1(); 
     ... 
    } 
    .... 
} 

在这里为您服务仍然只取决于DAO 定义并使用工厂来获得实现。需要注意的是,您的服务现在已连接到工厂。如果你愿意的话,你可以通过将工厂传递给你的构造函数来使它变得更加松散。

另外,别忘了Spring提供其他有用的功能,比如它的事务管理。这是非常有用的,即使你说你的应用程序,你不需要它。

+0

感谢您的回复。我对您的解释有进一步的疑问,Para1:-in spring如果我们想更改接口实现,那么我们必须在配置文件中进行更改,但在工厂类的情况下,我们必须对工厂类本身进行更改。你在说这里在配置文件中进行更改比工厂类更容易。但是它是如何使它更加可靠地耦合的,因为在这两种情况下,我们正在对外部组件进行更改配置文件或工厂类....... –

+0

continued..Para2: - 如果您想更改工厂返回,你必须改变实际的代码。希望当你说实际的代码时,你在这里说工厂类的代码。但是在弹簧的情况下,我们也必须在配置文件中进行更改。怎么比工厂类更少侵入? Para3:你说这里是为了解决运行时依赖问题,我们不能使用spring DI,而必须使用工厂类。如果是的话,它会回答我的另一个查询在http://stackoverflow.com/questions/7221615/how-to-configure-the-cofiguration-file-in-spring-if-we-want-to-decide-at-run -timeot –

+0

@mohit 1)。如果你改变了类的名字,或者Spring需要构造一个实例,那么你必须改变config * only * 2)“改变工厂返回值”与改变你想要的类相同,所以对于Spring来说,改变配置3)我不这么说,你可以很容易地得到一个applicationContext,并抓住对象,如果你想要的,然后配置它们。 – hvgotcodes

0

春天也使用工厂。只是工厂没有被任何应用程序代码引用,工厂将这些东西插在一起并交给他们。如果您从早期的问题中使用类似于DAO工厂的工厂,您的代码将明确引用该工厂,您必须构建该工厂或调用静态方法,这很丑陋。使用显式查找工厂方法,如果您想要测试代码来模拟工厂返回的内容,您必须修改工厂的工作方式,在Spring中您可以使用测试设置代码创建一个模拟实现并将其插入到事物中正在测试。

0

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

Spring使它不那么具有侵入性,因为它使用反射来自动“注入/创建”依赖关系。因此你的代码不需要参考工厂。

春天通常用于“类似单身人士”的对象创建。人们通常使用自定义工厂来暂时丢弃对象创建(如请求对象)。 事实上,您经常会让Spring创建并注入您的自定义工厂(即工厂的工厂)。