3.16.2 Glue code and the evil singleton
在应用中,推荐使用依赖注入的方式编写,使用Spring IoC容器管理的代码,当需要创建实例时,从容器获取他的依赖关系,并且对象对容器将对其一无所知。然而,对于有时需要将其他代码绑定在一起的小代码层,也许会需要与其他层、组件、bean互相协作,可以以单例(准单例)方式使用Spring IoC容器。例如,第三方组件可能尝试直接构造新对象(Class.forName()
style),而无法从Spring IoC容器中获取这些对象如果第三方组件创建的对象是stub或者proxy代理,然后这些对象以单例风格从Ioc容器获取真正的对象加以委派,此时控制反转完成主要工作(对象将脱离于容器管理)。此时,大部分代码不需知道容器、也不需知道如何访问容器,好处就是代码解耦。EJBs也可以使用这种方式,代理的方式委派给简单的java实现对象,java对象从Ioc容器检出。
在服务定位器样式中查找应用程序上下文有时是访问共享Spring管理的组件的唯一途径,例如在EJB 2.1环境中,或者当你希望跨WAR文件将WebContextContext作为父对象共享到WebApplicationContexts时。在这种情况下,你应该使用实用程序类ContextSingletonBeanFactoryLocator
定位器,在此Spring team blog entry有描述。