对于Spring应用程序上下文的引用基本有两种形式,一种就是通过实现Spring提供的Aware接口来得到Spring容器的应用程序上下文,第二种就是使用[i][b]ContextSingletonBeanFactoryLocator[/b][/i]来获得Spring应用程序上下文。
第一种情况就不用多说了,这里主要介绍第二种得到Spring应用程序上下文的方法。
在有些应用场景中,没有办法通过使用Spring的Aware接口将其上下文注入到需要使用Spring上下文的类中。这种情况一般发生在某个应用程序需要运行在特定容器中的情况,比如Web容器或者EJB容器。对于Web容器来说,Spring与现有的大多数流行MVC容器集成都很好,但是对于EJB容器就没有办法将Spring应用程序上下文的引用传递给新创建的EJB。也就是说Spring与现有的EJB容器的集成不是太好。
当然,可以让每个新创建的EJB都拥有一份Spring应用程序上下文的拷贝,但是这种方式在有的时候会引起性能上的很大消耗。比如Spring应用程序上下文包含相当多的Bean定义,或者包含初始化代价很高的Bean(Hibernate Session)。所以Spring提供了另外一种机制也就是共享上下文机制。
通过Spring提供的[i][b]ContextSingletonBeanFactoryLocator[/b][/i]或者[i][b]SingletonBeanFactoryLocator[/b][/i]来获得Spring应用程序上下文。这种方式下,Spring会缓存一个应用程序上下文的单例来提供给不同的调用者。
使用这种方式需要增加一个Spring的配置文件,该文件的默认名字为beanRefContext.xml,内容大致如下:
有了这个文件就可以使用下面的代码来获得Spring应用程序上下文的引用:
上面代码段的第一行代码就会读取默认的beanRefContext.xml配置文件(位于Classpath的根目录下),第二行代码指定了使用该配置文件中的那个Bean作为BeanFacotry,第三行代码则是用来获得真正的BeanFactory。
当然,用户也可以指定beanRefContext.xml为别的位置上的别的文件,通过ContextSingletonBeanFactoryLocator.getInstance(String)可以实现,具体请参考Spring的Java Doc。另外在beanRefContext.xml可以定义多个不同的ApplicationContext实现类,并且可以指定ApplicationContext实现类加载的配置文件的数量和路径。
如果在别的容器中需要使用Spring的应用程序上下文,但是又没有办法用其他方式来获得其上下文的时候可以采用这种方式。另外一个用处就是可以通过这种方式定义共享的Spring应用程序上下文。例如在一个J2EE EAR中可能有几个WAR,每个WAR中使用的底层Service都一样,那就可以用Spring来管理Service之间依赖和初始化工作,然后通过上述方式共享Spring应用程序上下文。
这种方式还可以实现用Spring来维护一个或者多有由不同Bean构成的组件,通过上面的方式来使用其中的组件。
第一种情况就不用多说了,这里主要介绍第二种得到Spring应用程序上下文的方法。
在有些应用场景中,没有办法通过使用Spring的Aware接口将其上下文注入到需要使用Spring上下文的类中。这种情况一般发生在某个应用程序需要运行在特定容器中的情况,比如Web容器或者EJB容器。对于Web容器来说,Spring与现有的大多数流行MVC容器集成都很好,但是对于EJB容器就没有办法将Spring应用程序上下文的引用传递给新创建的EJB。也就是说Spring与现有的EJB容器的集成不是太好。
当然,可以让每个新创建的EJB都拥有一份Spring应用程序上下文的拷贝,但是这种方式在有的时候会引起性能上的很大消耗。比如Spring应用程序上下文包含相当多的Bean定义,或者包含初始化代价很高的Bean(Hibernate Session)。所以Spring提供了另外一种机制也就是共享上下文机制。
通过Spring提供的[i][b]ContextSingletonBeanFactoryLocator[/b][/i]或者[i][b]SingletonBeanFactoryLocator[/b][/i]来获得Spring应用程序上下文。这种方式下,Spring会缓存一个应用程序上下文的单例来提供给不同的调用者。
使用这种方式需要增加一个Spring的配置文件,该文件的默认名字为beanRefContext.xml,内容大致如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
<beans>
<bean id="servicelayer-context"
class="org.springframework.context.support.
ClassPathXmlApplicationContext">
<constructor-arg>
<list>
<value>/servicelayer-applicationContext.xml</value>
</list>
</constructor-arg>
</bean>
</beans>
有了这个文件就可以使用下面的代码来获得Spring应用程序上下文的引用:
BeanFactoryLocator locator = ContextSingletonBeanFactoryLocator.getInstance();
BeanFactoryReference bfr = locator.useBeanFactory("serviceLayer-context");
//通过factory的getBean方法获得想要的bean....
BeanFactory factory = bfr.getFactory();
bfr.release();
上面代码段的第一行代码就会读取默认的beanRefContext.xml配置文件(位于Classpath的根目录下),第二行代码指定了使用该配置文件中的那个Bean作为BeanFacotry,第三行代码则是用来获得真正的BeanFactory。
当然,用户也可以指定beanRefContext.xml为别的位置上的别的文件,通过ContextSingletonBeanFactoryLocator.getInstance(String)可以实现,具体请参考Spring的Java Doc。另外在beanRefContext.xml可以定义多个不同的ApplicationContext实现类,并且可以指定ApplicationContext实现类加载的配置文件的数量和路径。
如果在别的容器中需要使用Spring的应用程序上下文,但是又没有办法用其他方式来获得其上下文的时候可以采用这种方式。另外一个用处就是可以通过这种方式定义共享的Spring应用程序上下文。例如在一个J2EE EAR中可能有几个WAR,每个WAR中使用的底层Service都一样,那就可以用Spring来管理Service之间依赖和初始化工作,然后通过上述方式共享Spring应用程序上下文。
这种方式还可以实现用Spring来维护一个或者多有由不同Bean构成的组件,通过上面的方式来使用其中的组件。