在Spring中构建EJB组件

本文探讨了Spring框架如何支持EJB技术,包括通过抽象类简化EJB开发、利用ApplicationContext管理资源的方式,以及如何通过BeanFactoryLocator接口实现资源的灵活访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
Spring对于EJB的支持<o:p></o:p>
SpringEJB支持能够粗略的分成两类:访问和实现。Spring中的访问支持类使你能够容易的访问EJB资源。Spring提供了三种抽象类作为EJB bean类的基类,他们是: <o:p></o:p>
l         AbstractStatelessSessionBean<o:p></o:p>
l         AbstractStatefulSessionBean<o:p></o:p>
l         AbstractMessageDrivenBean<o:p></o:p>
当使用Spring来构建EJB的时候,必须提供所有不同的接口和home类,在JCF介绍一节中已经做过介绍。但是,当实现bean类的时候,就需要从合适的Spring基类继承。Spring提供的基类允许EJB组件访问SpringApplicationContext,并且,这样允许这些组件访问Spring所管理的资源。这有助于将业务逻辑从EJB实现中分离,写到EJBSpring管理的POJO对象中。<o:p></o:p>
Spring提供的基类AbstractEnterpriseBean暴露了beanFactoryLocator属性来允许子类访问正在使用的实例BeanFactoryLocatorAbstractStatelessSessionBean类已经实现了ejbCreate()ejbActivate()ejbPassivate()方法,而类AbstractStatefulSessionBean并没有实现这些方法。<o:p></o:p>
Spring能够从ApplicationContext中装载所管理的资源,Spring中的EJB基类的主要特征就是能够访问ApplicationContext来装载资源。下面看看在系统的SLSB实例化的时候都做了些什么。<o:p></o:p>
    public void setSessionContext(SessionContext ctx) {<o:p></o:p>
       super.setSessionContext(ctx);<o:p></o:p>
       setBeanFactoryLocator(ContextSingletonBeanFactoryLocator<o:p></o:p>
              .getInstance("classpath*:beanRefContext.xml"));<o:p></o:p>
       setBeanFactoryLocatorKey("applicationContext-main");<o:p></o:p>
    }<o:p></o:p>
SLSB在第一次实例化的时候从classpath中加载beanRefContext.xml配置文件,生成一个ContextSingletonBeanFactoryLocator,再指明BeanFactoryLocatorKeyapplicationContext-main。如下面所示:<o:p></o:p>
<beans><o:p></o:p>
  <bean name="applicationContext-main"<o:p></o:p>
   class="org.springframework.context.support.FileSystemXmlApplicationContext"><o:p></o:p>
    <constructor-arg><o:p></o:p>
      <list><o:p></o:p>
        <value>etc/jcf/framework/config/applicationContext.xmlvalue><o:p></o:p>
        <value>etc/jcf/framework/config/applicationContext-dao.xmlvalue><o:p></o:p>
       <value>etc/jcf/framework/config/applicationContext-command.xmlvalue><o:p></o:p>
        <value>etc/jcf/framework/config/applicationContext-jms.xmlvalue><o:p></o:p>
       <value>etc/jcf/framework/config/applicationContext-service.xmlvalue><o:p></o:p>
      value>etc/jcf/framework/config/applicationContext-processor.xmlvalue><o:p></o:p>
      list><o:p></o:p>
    constructor-arg><o:p></o:p>
  bean><o:p></o:p>
beans><o:p></o:p>
                                        beanRefContext.xml<o:p></o:p>
<o:p> </o:p>
beanRefContext.xml文件中指明了Spring所用到的配置文件在文件系统中的位置。     Spring能够从ApplicationContext中装载所管理的资源的功能不是基类本身提供的,而是被委托给BeanFactoryLocator接口的实现,如下所示:<o:p></o:p>
abstract class AbstractEnterpriseBean implements EnterpriseBean {
      protected BeanFactory getBeanFactory() {<o:p></o:p>
       return this.beanFactoryReference.getFactory();<o:p></o:p>
    }<o:p></o:p>
}<o:p></o:p>
                     BeanFactoryLocator 接口<o:p></o:p>
<o:p> </o:p>
BeanFactoryLocator并不直接返回BeanFactory实例;而是返回一个BeanFactoryReferenceBeanFactoryReference是一个轻量级BeanFactoryApplicationContext的包装器,这个包装器允许使用BeanFactory的资源平滑地释放对BeanFactory的引用。缺省情况下,所有EJB基类使用了BeanFactoryLocator的 实现。本质上来说,这个类在一个给定JNDI地点上查找一个逗号分隔的配置文件列表,并且使用这些配置文件来创建ClassPathXmlApplicationContext的实例。三个基本EJB类都通过AbstractEnterpriseBean类表现出属性beanFactoryLocator,通过设置这个属性,就能够提供你自己对于BeanFactoryLocator的不同实现。然而,如果你这样做了,那么,bean的每一个实例都有它自己的ContextJndiBeanFactoryLocator实例,同样,每个ContextJndiBeanFactoryLocator的实例都有它自己的ClassPathXmlApplicationContext实例。<o:p></o:p>
       虽然为你的EJB实例创建的所有ApplicationContext实例都用同样的方式配置的,但是,所配置的bean是不一样的。如果你的应用程序服务器创建100EJB个实例,那么,也创建了100ContextJndiBeanFactoryLocator的实例,以及100ClassPathXmlApplicationContext。如果应用程序不希望发生这种情况,那么Spring提供SingletonBeanFactoryLocatorContextSingletonBeanFactoryLocator类来分别装载BeanFactoryApplicationContext的单件实例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值