3 回答
TA贡献1802条经验 获得超5个赞
ApplicationContext.getBean()
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>
myClass
myOtherClass
.
<bean id="myApplication" class="MyApplication"> <property name="myCentralClass" ref="myCentralClass"/> <property name="myOtherCentralClass" ref="myOtherCentralClass"/></bean>
MyApplication
main
applicationContext.getBean("myApplication")
getBean()
TA贡献1835条经验 获得超7个赞
对其他人来说,服务定位器在代码中更容易遵循。IoC是“神奇的”,但是维护程序员必须了解您复杂的Spring配置和所有的位置,才能弄清楚您是如何连接对象的。 对于调试配置问题,IoC是很糟糕的。在某些类型的应用程序中,当配置错误时,应用程序不会启动,并且您可能没有机会逐步了解调试器正在发生的事情。 IoC主要是基于XML的(注释改进了一些东西,但是仍然有很多XML)。这意味着开发人员不能在您的程序上工作,除非他们知道Spring定义的所有神奇标记。它不够好,不能再了解Java了。这阻碍了经验较少的程序员。当更简单的解决方案(如ServiceLocator)满足相同的需求时,使用更复杂的解决方案实际上是很糟糕的设计)。另外,对诊断XML问题的支持比对Java问题的支持要弱得多。 依赖注入更适合于较大的程序。大多数情况下,额外的复杂性是不值得的。 经常使用Spring,以防“以后可能要更改实现”。没有SpringIoC那样的复杂性,还有其他方法可以实现这一点。 对于Web应用程序(JavaEEWAR),Spring上下文在编译时被有效地绑定(除非您希望操作符在爆炸性的WAR中对上下文进行搜索)。您可以让Spring使用属性文件,但是对于Servlets,属性文件需要位于预先确定的位置,这意味着您不能在同一个盒子上部署多个相同时间的servlet。您可以在servlet启动时使用Spring和JNDI来更改属性,但是如果您使用JNDI作为管理员可修改的参数,那么Spring本身的需求就会减少(因为JNDI实际上是一个服务定位器)。 使用Spring,如果Spring向您的方法调度,您可能会失去程序控制。这很方便,适用于许多类型的应用程序,但不是全部。您可能需要在初始化期间创建任务(线程等)时控制程序流,或者需要Spring不知道内容何时绑定到WAR的可修改资源。
添加回答
举报