Spring对于EJB的支持<o:p></o:p>
Spring对EJB支持能够粗略的分成两类:访问和实现。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组件访问Spring的ApplicationContext,并且,这样允许这些组件访问Spring所管理的资源。这有助于将业务逻辑从EJB实现中分离,写到EJB的Spring管理的POJO对象中。<o:p></o:p>
Spring提供的基类AbstractEnterpriseBean暴露了beanFactoryLocator属性来允许子类访问正在使用的实例BeanFactoryLocator。AbstractStatelessSessionBean类已经实现了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,再指明BeanFactoryLocatorKey为applicationContext-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实例;而是返回一个BeanFactoryReference。BeanFactoryReference是一个轻量级BeanFactory或ApplicationContext的包装器,这个包装器允许使用BeanFactory的资源平滑地释放对BeanFactory的引用。缺省情况下,所有EJB基类使用了BeanFactoryLocator的 实现。本质上来说,这个类在一个给定JNDI地点上查找一个逗号分隔的配置文件列表,并且使用这些配置文件来创建ClassPathXmlApplicationContext的实例。三个基本EJB类都通过AbstractEnterpriseBean类表现出属性beanFactoryLocator,通过设置这个属性,就能够提供你自己对于BeanFactoryLocator的不同实现。然而,如果你这样做了,那么,bean的每一个实例都有它自己的ContextJndiBeanFactoryLocator实例,同样,每个ContextJndiBeanFactoryLocator的实例都有它自己的ClassPathXmlApplicationContext实例。<o:p></o:p>
虽然为你的EJB实例创建的所有ApplicationContext实例都用同样的方式配置的,但是,所配置的bean是不一样的。如果你的应用程序服务器创建100EJB个实例,那么,也创建了100个ContextJndiBeanFactoryLocator的实例,以及100个ClassPathXmlApplicationContext。如果应用程序不希望发生这种情况,那么Spring提供SingletonBeanFactoryLocator和ContextSingletonBeanFactoryLocator类来分别装载BeanFactory和ApplicationContext的单件实例。