`
Mysun
  • 浏览: 270773 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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,内容大致如下:
<?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构成的组件,通过上面的方式来使用其中的组件。
2
0
分享到:
评论

相关推荐

    Spring面试题

    ☆ Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。 ☆ Spring AOP:通过配置管理特性,Spring AOP ...

    SpringFXExample

    FXMLLoader的主要目的是从Spring bean工厂(也称为应用程序上下文)中检索控制器实例。 这是通过在FXMLLoader上设置一个控制器工厂来实现的,该控制器工厂委托给bean工厂:本质上,这只是loader....

    领域驱动设计与模式实战

    7.3.1 上下文,上下文,还是上下文 7.3.2 数据库约束 7.3.3 将规则绑定到与领域有关的转换,还是绑定到与基础架构有关的转换 7.3.4 精化原则:所有状态,即使是错误状态,都应该是可保存的 7.4 与持久化有关的基本的...

    java面试题

    6:Spring Context:向Spring框架提供上下文信息 7:Spring MVC:分离模型、视图、控制器、以便更容易定制 折构函数和虚函数? 答:折构函数式销毁一个类的函数,虚函数是为了C++的动态绑定而设计的。 描述你的...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    不同的Webview之间无法共享数据。(3)页面自适应问题。页面难以兼容适应不同分辨率的设备和浏览器。 本文研究并设计了基于Android+HTML5的在线认证检测系统,主要工作包括以下四个方面: (1)针对多窗口类浏览器...

    互联网创意产品众筹平台

    问题一箩筐-自定义监听器,解决上下文路径使用问题 │ 10.问题一箩筐-重载-笔试题+ i4 I$ j6 d/ [- j: d │ 11.问题一箩筐-悲观锁和乐观锁7 L; ^; s& i# h/ l8 O$ m/ \' F │ 12.登录业务介绍-界面介绍! Z9 ?( h9 e$ ...

    JAVA上百实例源码以及开源项目

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    JAVA上百实例源码以及开源项目源代码

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    JAVA核心知识点整理(有效)

    2.2.4. 堆(Heap-线程共享)-运行时数据区 ...................................................................................... 23 2.2.5. 方法区/永久代(线程共享) ............................................

Global site tag (gtag.js) - Google Analytics