为什么Spring的ApplicationContext.getBean被认为是坏的?

问题:

我问了一个普遍的Spring问题:Auto-cast Spring Beans,有多个人回应说应该尽可能避免调用Spring的ApplicationContext.getBean()。这是为什么?
我还应该如何访问我配置的Spring来创建的bean?
我在非Web应用程序中使用Spring,并计划访问共享的ApplicationContext对象as described by LiorH
 修订
我接受下面的答案,但是马丁·福勒(Martin Fowler)的另一个选择是,discusses the merits of Dependency Injection vs. using a Service Locator(这与打包裹ApplicationContext.getBean()本质上是一样的)。
福勒说:“With service locator the application class asks for it [the service] explicitly by a message to the locator. With injection there is no explicit request, the service appears in the application class – hence the inversion of control.
Inversion of control is a common feature of frameworks, but it’s something that comes at a price. It tends to be hard to understand and leads to problems when you are trying to debug. So on the whole I prefer to avoid it [Inversion of Control] unless I need it. This isn’t to say it’s a bad thing, just that I think it needs to justify itself over the more straightforward alternative.

回答:

我在另一个问题的评论中提到这一点,但反转控制的整个想法是none of your classes know or care how they get the objects they depend on。这样可以随时更改您使用的给定依赖关系的任何类型的实现。它也使得类易于测试,因为您可以提供依赖关系的模拟实现。最后,它使得课程simpler更侧重于他们的核心责任。
调用ApplicationContext.getBean()不是控制的反转!虽然更改为给定的bean名称配置了什么实现仍然很容易,但是该类现在直接依赖于Spring来提供该依赖关系,并且无法以其他方式获得它。你不能仅仅在测试类中进行自己的模拟实现,而是自己传递给它。这基本上击败了Spring的依赖注入容器的目的。
你想说的任何地方:

MyClass myClass = applicationContext.getBean("myClass");

你应该改为,例如,声明一个方法:

public void setMyClass(MyClass myClass) {
   this.myClass = myClass;
}

然后在你的配置:
class=”lang-xml prettyprint-override”>

<bean id="myClass" class="MyClass">...</bean>

<bean id="myOtherClass" class="MyOtherClass">
   <property name="myClass" ref="myClass"/>
</bean>

然后Spring会自动将myClass注入myOtherClass
以这种方式宣告一切,在根本上都有如下的东西:
class=”lang-xml prettyprint-override”>

<bean id="myApplication" class="MyApplication">
   <property name="myCentralClass" ref="myCentralClass"/>
   <property name="myOtherCentralClass" ref="myOtherCentralClass"/>
</bean>

 MyApplication是最中心的课程,至少间接地依赖于程序中的其他所有服务。当您的main方法引导时,您可以调用applicationContext.getBean("myApplication"),但您不必在其他任何地方调用getBean()

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Why is Spring’s ApplicationContext.getBean considered bad?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

92 − 86 =