我在对另一个问题的评论中提到了这一点,但控制反转的整个想法是你的任何类都不知道或关心他们如何获得他们所依赖的对象。这使您可以轻松地随时更改您使用的给定依赖项的实现类型。它还使类易于测试,因为您可以提供依赖项的模拟实现。最后,它使类更简单并且更专注于它们的核心职责。
调用 ApplicationContext.getBean()
不是控制反转!虽然更改为给定 bean 名称配置的实现仍然很容易,但该类现在直接依赖 Spring 来提供该依赖关系,并且无法以任何其他方式获得它。您不能只是在测试类中制作自己的模拟实现并自己将其传递给它。这基本上违背了 Spring 作为依赖注入(inject)容器的目的。
你想说的任何地方:
MyClass myClass = applicationContext.getBean("myClass");
例如,您应该声明一个方法:
public void setMyClass(MyClass myClass) {
this.myClass = myClass;
}
然后在你的配置中:
<bean id="myClass" class="MyClass">...</bean>
<bean id="myOtherClass" class="MyOtherClass">
<property name="myClass" ref="myClass"/>
</bean>
Spring 会自动将 myClass
注入(inject) myOtherClass
。
以这种方式声明所有内容,并且在其根源上都有类似的内容:
<bean id="myApplication" class="MyApplication">
<property name="myCentralClass" ref="myCentralClass"/>
<property name="myOtherCentralClass" ref="myOtherCentralClass"/>
</bean>
MyApplication
是最核心的类,并且至少间接依赖于程序中的所有其他服务。引导时,在您的 main
方法中,您可以调用 applicationContext.getBean("myApplication")
但您不需要调用 getBean()
其他任何地方!
我是一名优秀的程序员,十分优秀!