Spring共享上下文机制
对于Spring应用程序上下文的引用基本有两种形式,一种就是通过实现Spring提供的Aware接口来得到Spring容器的应用程序上下文,第二种就是使用ContextSingletonBeanFactoryLocator来获得Spring应用程序上下文。
第一种情况就不用多说了,这里主要介绍第二种得到Spring应用程序上下文的方法。
在有些应用场景中,没有办法通过使用Spring的Aware接口将其上下文注入到需要使用Spring上下文的类中。这种情况一般发生在某个应用程序需要运行在特定容器中的情况,比如Web容器或者EJB容器。对于Web容器来说,Spring与现有的大多数流行MVC容器集成都很好,但是对于EJB容器就没有办法将Spring应用程序上下文的引用传递给新创建的EJB。也就是说Spring与现有的EJB容器的集成不是太好。
当然,可以让每个新创建的EJB都拥有一份Spring应用程序上下文的拷贝,但是这种方式在有的时候会引起性能上的很大消耗。比如Spring应用程序上下文包含相当多的Bean定义,或者包含初始化代价很高的Bean(Hibernate Session)。所以Spring提供了另外一种机制也就是共享上下文机制。
通过Spring提供的ContextSingletonBeanFactoryLocator或者SingletonBeanFactoryLocator来获得Spring应用程序上下文。这种方式下,Spring会缓存一个应用程序上下文的单例来提供给不同的调用者。
使用这种方式需要增加一个Spring的配置文件,该文件的默认名字为beanRefContext.xml,内容大致如下:
BeanFactoryLocator locator = ContextSingletonBeanFactoryLocator.getInstance();BeanFactoryReference bfr = locator.useBeanFactory("serviceLayer-context");//通过factory的getBean方法获得想要的bean....BeanFactory factory = bfr.getFactory();bfr.release();