spring和ejb2.x集成共享applicationContext.xml的问题
http://ybzshizds.iteye.com/blog/313342
默认的作法:
jboss.xml中这样配置
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 3.0//EN" "http://www.jboss.org/j2ee/dtd/jboss_3_0.dtd">
- <jboss>
- <enterprise-beans>
- <!--
- To add beans that you have deployment descriptor info for, add
- a file to your XDoclet merge directory called jboss-beans.xml that contains
- the <session></session>, <entity></entity> and <message-driven></message-driven>
- markup for those beans.
- -->
- <session>
- <ejb-name>TrainArticle</ejb-name>
- <jndi-name>ejb/TrainArticle</jndi-name>
- </session>
- <session>
- <ejb-name>TrainOrganInfo</ejb-name>
- <jndi-name>ejb/TrainOrganInfo</jndi-name>
- </session>
- <!--
- write a merge file jboss-webservices.ent for webservice-description
- -->
- </enterprise-beans>
- <resource-managers>
- </resource-managers>
- <!--
- | for container settings, you can merge in jboss-container.xml
- | this can contain <invoker-proxy-bindings/> and <container-configurations/>
- -->
- </jboss>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 3.0//EN" "http://www.jboss.org/j2ee/dtd/jboss_3_0.dtd">
<jboss>
<enterprise-beans>
<!--
To add beans that you have deployment descriptor info for, add
a file to your XDoclet merge directory called jboss-beans.xml that contains
the <session></session>, <entity></entity> and <message-driven></message-driven>
markup for those beans.
-->
<session>
<ejb-name>TrainArticle</ejb-name>
<jndi-name>ejb/TrainArticle</jndi-name>
</session>
<session>
<ejb-name>TrainOrganInfo</ejb-name>
<jndi-name>ejb/TrainOrganInfo</jndi-name>
</session>
<!--
write a merge file jboss-webservices.ent for webservice-description
-->
</enterprise-beans>
<resource-managers>
</resource-managers>
<!--
| for container settings, you can merge in jboss-container.xml
| this can contain <invoker-proxy-bindings/> and <container-configurations/>
-->
</jboss>
在ejb.jar.xml中这样配置
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
- <ejb-jar >
- <description><![CDATA[No Description.]]></description>
- <display-name>Generated by XDoclet</display-name>
- <enterprise-beans>
- <!-- Session Beans -->
- <session >
- <description><![CDATA[Description for TrainArticle]]></description>
- <display-name>Train Article Handler Bean</display-name>
- <ejb-name>TrainArticle</ejb-name>
- <home>com.train.search.ejb.TrainArticleHome</home>
- <remote>com.train.search.ejb.TrainArticle</remote>
- <ejb-class>com.train.search.ejb.TrainArticleBean</ejb-class>
- <session-type>Stateless</session-type>
- <transaction-type>Container</transaction-type>
- <env-entry>
- <env-entry-name>ejb/BeanFactoryPath</env-entry-name>
- <env-entry-type>java.lang.String</env-entry-type>
- <env-entry-value>applicationContext.xml</env-entry-value>
- </env-entry>
- </session>
- <session >
- <description><![CDATA[Description for TrainOrganInfo]]></description>
- <display-name>Train OrganInfo Handler Bean</display-name>
- <ejb-name>TrainOrganInfo</ejb-name>
- <home>com.train.search.ejb.TrainOrganInfoHome</home>
- <remote>com.train.search.ejb.TrainOrganInfo</remote>
- <ejb-class>com.train.search.ejb.TrainOrganInfoBean</ejb-class>
- <session-type>Stateless</session-type>
- <transaction-type>Container</transaction-type>
- <env-entry>
- <env-entry-name>ejb/BeanFactoryPath</env-entry-name>
- <env-entry-type>java.lang.String</env-entry-type>
- <env-entry-value>applicationContext.xml</env-entry-value>
- </env-entry>
- </session>
- </enterprise-beans>
- <assembly-descriptor >
- </assembly-descriptor>
- </ejb-jar>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jar >
<description><![CDATA[No Description.]]></description>
<display-name>Generated by XDoclet</display-name>
<enterprise-beans>
<!-- Session Beans -->
<session >
<description><![CDATA[Description for TrainArticle]]></description>
<display-name>Train Article Handler Bean</display-name>
<ejb-name>TrainArticle</ejb-name>
<home>com.train.search.ejb.TrainArticleHome</home>
<remote>com.train.search.ejb.TrainArticle</remote>
<ejb-class>com.train.search.ejb.TrainArticleBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
<env-entry>
<env-entry-name>ejb/BeanFactoryPath</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>applicationContext.xml</env-entry-value>
</env-entry>
</session>
<session >
<description><![CDATA[Description for TrainOrganInfo]]></description>
<display-name>Train OrganInfo Handler Bean</display-name>
<ejb-name>TrainOrganInfo</ejb-name>
<home>com.train.search.ejb.TrainOrganInfoHome</home>
<remote>com.train.search.ejb.TrainOrganInfo</remote>
<ejb-class>com.train.search.ejb.TrainOrganInfoBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
<env-entry>
<env-entry-name>ejb/BeanFactoryPath</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>applicationContext.xml</env-entry-value>
</env-entry>
</session>
</enterprise-beans>
<assembly-descriptor >
</assembly-descriptor>
</ejb-jar>
TrainArticleBean.java
- package com.train.search.ejb;
- import java.rmi.RemoteException;
- import java.util.List;
- import javax.ejb.CreateException;
- import com.train.compass.service.TraArticleService;
- import com.train.search.ejb.vo.TraArticle;
- import com.util.pagination.Page;
- public class TrainArticleBean extends AbstractStatelessSessionBean{
- private static final long serialVersionUID = -8153415548838977604L;
- private TraArticleService traArticleService;
- @Override
- protected void onEjbCreate() throws CreateException {
- if(traArticleService==null){
- traArticleService=(TraArticleService)getBeanFactory().getBean("traArticleService");
- }
- }
- public void updateArticle(TraArticle traArticle) throws RemoteException{
- traArticleService.updateArticle(traArticle);
- }
- public int deleteArticles(final List articleIDs) throws RemoteException{
- return traArticleService.deleteArticles(articleIDs);
- }
- public TraArticle loadByArticleID(int articleID) throws RemoteException{
- return traArticleService.loadByArticleID(articleID);
- }
- public TraArticle storeArticle(TraArticle traArticle) throws RemoteException{
- return traArticleService.storeArticle(traArticle);
- }
- public Page findByOrgnID( int orgnID, Page page) throws RemoteException{
- return traArticleService.findByOrgnID(orgnID, page);
- }
- public Page search(Page page) throws RemoteException{
- return traArticleService.search(page);
- }
- public TraArticle Query(int articleID) throws RemoteException{
- return traArticleService.Query(articleID);
- }
- public boolean insert(TraArticle[] ta) throws RemoteException{
- return traArticleService.insert(ta);
- }
- public List getAllArticles(int orgnIDBegin,int orgnIDEnd) throws RemoteException{
- return traArticleService.getAllArticles(orgnIDBegin, orgnIDEnd);
- }
- public int getAllArticleCount(int orgnID) throws RemoteException{
- return traArticleService.getAllArticleCount(orgnID);
- }
- }
package com.train.search.ejb;
import java.rmi.RemoteException;
import java.util.List;
import javax.ejb.CreateException;
import com.train.compass.service.TraArticleService;
import com.train.search.ejb.vo.TraArticle;
import com.util.pagination.Page;
public class TrainArticleBean extends AbstractStatelessSessionBean{
private static final long serialVersionUID = -8153415548838977604L;
private TraArticleService traArticleService;
@Override
protected void onEjbCreate() throws CreateException {
if(traArticleService==null){
traArticleService=(TraArticleService)getBeanFactory().getBean("traArticleService");
}
}
public void updateArticle(TraArticle traArticle) throws RemoteException{
traArticleService.updateArticle(traArticle);
}
public int deleteArticles(final List articleIDs) throws RemoteException{
return traArticleService.deleteArticles(articleIDs);
}
public TraArticle loadByArticleID(int articleID) throws RemoteException{
return traArticleService.loadByArticleID(articleID);
}
public TraArticle storeArticle(TraArticle traArticle) throws RemoteException{
return traArticleService.storeArticle(traArticle);
}
public Page findByOrgnID( int orgnID, Page page) throws RemoteException{
return traArticleService.findByOrgnID(orgnID, page);
}
public Page search(Page page) throws RemoteException{
return traArticleService.search(page);
}
public TraArticle Query(int articleID) throws RemoteException{
return traArticleService.Query(articleID);
}
public boolean insert(TraArticle[] ta) throws RemoteException{
return traArticleService.insert(ta);
}
public List getAllArticles(int orgnIDBegin,int orgnIDEnd) throws RemoteException{
return traArticleService.getAllArticles(orgnIDBegin, orgnIDEnd);
}
public int getAllArticleCount(int orgnID) throws RemoteException{
return traArticleService.getAllArticleCount(orgnID);
}
}
TrainOrganInfoBean.java
- package com.train.search.ejb;
- import java.rmi.RemoteException;
- import java.util.List;
- import javax.ejb.CreateException;
- import com.train.compass.service.TraOrganInfoService;
- import com.train.search.ejb.vo.TraOrganInfo;
- import com.util.pagination.Page;
- public class TrainOrganInfoBean extends AbstractStatelessSessionBean{
- private static final long serialVersionUID = -8153415548838977604L;
- private TraOrganInfoService traOrganInfoService;
- @Override
- protected void onEjbCreate() throws CreateException {
- if(traOrganInfoService==null){
- traOrganInfoService=(TraOrganInfoService)getBeanFactory().getBean("traOrganInfoService");
- }
- }
- public TraOrganInfo getTraOrganInfoByID(Integer traID) throws RemoteException{
- return traOrganInfoService.getTraOrganInfoByID(traID);
- }
- public void updateTraOrganInfo(TraOrganInfo traOrganInfo) throws RemoteException{
- traOrganInfoService.updateTraOrganInfo(traOrganInfo);
- }
- public TraOrganInfo findTraOrganInfoByName(String userName) throws RemoteException{
- return traOrganInfoService.findTraOrganInfoByName(userName);
- }
- public TraOrganInfo storeTraOrganInfo(TraOrganInfo traOrganInfo) throws RemoteException{
- return traOrganInfoService.storeTraOrganInfo(traOrganInfo);
- }
- public boolean updatePassword(Integer traID,String password) throws RemoteException{
- return traOrganInfoService.updatePassword(traID, password);
- }
- public Page search(Page page) throws RemoteException{
- return traOrganInfoService.search(page);
- }
- public TraOrganInfo Query(int trainID) throws RemoteException{
- return traOrganInfoService.Query(trainID);
- }
- public boolean insert(TraOrganInfo[] to) throws RemoteException{
- return traOrganInfoService.insert(to);
- }
- public List getAllOrganInfos(int trainIDBegin, int trainIDEnd) throws RemoteException{
- return traOrganInfoService.getAllOrganInfos(trainIDBegin, trainIDEnd);
- }
- public void auditingOrganInfo(Integer traID, Short checkFlag) throws RemoteException{
- traOrganInfoService.auditingOrganInfo(traID, checkFlag);
- }
- }
package com.train.search.ejb;
import java.rmi.RemoteException;
import java.util.List;
import javax.ejb.CreateException;
import com.train.compass.service.TraOrganInfoService;
import com.train.search.ejb.vo.TraOrganInfo;
import com.util.pagination.Page;
public class TrainOrganInfoBean extends AbstractStatelessSessionBean{
private static final long serialVersionUID = -8153415548838977604L;
private TraOrganInfoService traOrganInfoService;
@Override
protected void onEjbCreate() throws CreateException {
if(traOrganInfoService==null){
traOrganInfoService=(TraOrganInfoService)getBeanFactory().getBean("traOrganInfoService");
}
}
public TraOrganInfo getTraOrganInfoByID(Integer traID) throws RemoteException{
return traOrganInfoService.getTraOrganInfoByID(traID);
}
public void updateTraOrganInfo(TraOrganInfo traOrganInfo) throws RemoteException{
traOrganInfoService.updateTraOrganInfo(traOrganInfo);
}
public TraOrganInfo findTraOrganInfoByName(String userName) throws RemoteException{
return traOrganInfoService.findTraOrganInfoByName(userName);
}
public TraOrganInfo storeTraOrganInfo(TraOrganInfo traOrganInfo) throws RemoteException{
return traOrganInfoService.storeTraOrganInfo(traOrganInfo);
}
public boolean updatePassword(Integer traID,String password) throws RemoteException{
return traOrganInfoService.updatePassword(traID, password);
}
public Page search(Page page) throws RemoteException{
return traOrganInfoService.search(page);
}
public TraOrganInfo Query(int trainID) throws RemoteException{
return traOrganInfoService.Query(trainID);
}
public boolean insert(TraOrganInfo[] to) throws RemoteException{
return traOrganInfoService.insert(to);
}
public List getAllOrganInfos(int trainIDBegin, int trainIDEnd) throws RemoteException{
return traOrganInfoService.getAllOrganInfos(trainIDBegin, trainIDEnd);
}
public void auditingOrganInfo(Integer traID, Short checkFlag) throws RemoteException{
traOrganInfoService.auditingOrganInfo(traID, checkFlag);
}
}
出现的问题:
每调用一个EJB Bean的时候,都会让spring的容器初始化一次,这无疑是一种资源浪费,因为
spring的配置文件,applicationContext.xml只需加载一次就可以了
为了寻求解决的办法,找了一些资料,查看了一下源码
最后解决方案如下:
新建MyAbstractStatelessSessionBean.java继承自AbstractStatelessSessionBean
setBeanFactoryLocatorKey()和setBeanFactoryLocator(),改变 AbstractStatelessSessionBean.java的默认行为
- package com.train.search.ejb;
- import org.springframework.beans.factory.access.BeanFactoryLocator;
- import org.springframework.beans.factory.access.SingletonBeanFactoryLocator;
- import org.springframework.ejb.support.AbstractStatelessSessionBean;
- public abstract class MyAbstractStatelessSessionBean extends AbstractStatelessSessionBean {
- private static final long serialVersionUID = 5192139144489442341L;
- private BeanFactoryLocator beanFactoryLocator=SingletonBeanFactoryLocator.getInstance();
- public MyAbstractStatelessSessionBean(){
- super();
- this.setBeanFactoryLocatorKey("global.spring.ejb.context");
- this.setBeanFactoryLocator(beanFactoryLocator);
- }
- }
package com.train.search.ejb;
import org.springframework.beans.factory.access.BeanFactoryLocator;
import org.springframework.beans.factory.access.SingletonBeanFactoryLocator;
import org.springframework.ejb.support.AbstractStatelessSessionBean;
public abstract class MyAbstractStatelessSessionBean extends AbstractStatelessSessionBean {
private static final long serialVersionUID = 5192139144489442341L;
private BeanFactoryLocator beanFactoryLocator=SingletonBeanFactoryLocator.getInstance();
public MyAbstractStatelessSessionBean(){
super();
this.setBeanFactoryLocatorKey("global.spring.ejb.context");
this.setBeanFactoryLocator(beanFactoryLocator);
}
}
然后让TrainOrganInfoBean.java 和 TrainArticleBean.java都继承自MyAbstractStatelessSessionBean.java
加入beanRefFactory.xml文件
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
- <!--
- - Application context definition for Petclinic on Hibernate.
- -->
- <beans>
- <bean id="global.spring.ejb.context" class="org.springframework.context.support.ClassPathXmlApplicationContext">
- <constructor-arg>
- <list>
- <value>META-INF/applicationContext.xml</value>
- </list>
- </constructor-arg>
- </bean>
- </beans>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<!--
- Application context definition for Petclinic on Hibernate.
-->
<beans>
<bean id="global.spring.ejb.context" class="org.springframework.context.support.ClassPathXmlApplicationContext">
<constructor-arg>
<list>
<value>META-INF/applicationContext.xml</value>
</list>
</constructor-arg>
</bean>
</beans>
这样Spring的applicationContext.xml配置文件就只需加载一次即可!
spring和ejb2.x集成共享applicationContext.xml的问题相关推荐
- Spring学习总结(7)——applicationContext.xml 配置文详解
web.xml中classpath:和classpath*: 有什么区别? classpath:只会到你的class路径中查找找文件; classpath*:不仅包含class路径,还包括jar文件 ...
- Spring整合了CXF的一个applicationContext.xml的配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- Spring的junit4测试集成
Spring的junit测试集成 Spring提供spring-test-4.2.4.RELEASE.jar 可以整合junit. 优势:可以简化测试代码(不需要手动创建上下文,即手动创建spring ...
- IDEA创建applicationContext.xml文件图标不是xml文件图标
开始是在初学spring的时候发现创建的applicationContext.xml文件图标异常,且不会有设置Configure application context的提示,如图所示 查阅资料后发现 ...
- spring框架里面applicationContext.xml 和spring-servlet.xml 的区别
问题:spring框架里面applicationContext.xml 和spring-servlet.xml 的区别 在Spring框架中applicationContext.xml和Spring ...
- Spring 配置文件applicationContext.xml
Spring配置文件是用于指导Spring工厂进行Bean生产.依赖关系注入(装配)及Bean实例分发的"图纸". Spring配置文件是一个或多个标准的XML文档,applica ...
- spring整合hibernate(注解、xml)applicationContext.xml配置
每次ssh框架整合都很麻烦,今天有空余时间总结下(主要总结spring+hibernate): 1.注解方式整合: applicationContext.xml配置文件: <?xml versi ...
- spring 找不到applicationContext.xml解决方法
初学Spring在用Resource rs=new ClassPathResource("applicationContext.xml");时老是遇到这个错误.后来发现用 Appl ...
- Spring配置文件applicationContext.xml的两种拆分方式
第一种: 通过web.xml配置加载spring上下文环境,其配置方式如下: web.xml [xhtml] view plain copy <context-param> <par ...
最新文章
- Python中的super()函数
- torch tensor用法
- spring中resource设计与实现
- oracle hyperion招聘,Hyperion Planning功能顾问
- scrum in agile development
- C++ 基础知识!初学者必看!
- jsp页面将数据导出到Excel
- redis映射的概念_Redis存储总是心里没底?你大概漏了这些数据结构原理
- NodeJS链接MongDB
- android手机冻屏问题,android 模拟冻屏 代码实现
- 回溯算法解迷宫问题(java版)
- 基于springboot的科技馆设备巡检系统
- 高频感应加热电源驱动电路设计方案
- python能做什么工作知乎-python能做什么知乎
- Zabbix监控网站
- AutoCAD 2006/2007等在高版本系统上无法安装
- Hibernate 列映射 – 解决其他类型映射命名冲突
- 微信小程序分页加载列表
- 如何解决Kettle读取txt文件时出现的中文乱码问题?
- docker logs
热门文章
- 【数据结构与算法】之深入解析“字符串相乘”的求解思路与算法示例
- 2014/School_C_C++_A/3/x的x次幂
- The 3n + 1 problem UVA - 100
- 华农计算机科学宿舍在哪个区,新生指南Ⅵ | 住在华农·看看我们第二个家
- python panda apply_python – Pandas – 关于apply函数缓慢的解释
- 专科 java转go 翱翔之路(四)协议通信 锁,互斥锁 读写锁 条件变量锁 连接mysql 查询
- deamon守护进程
- POJ 1064 Cable master (二分答案,G++不过,C++就过了)
- 每天一道LeetCode-----计算二叉树的最大路径和,路径只需要从一个节点到达另一个节点,无其他要求
- 关于计算机的使用方法中心,关于新校区行政楼和活动中心楼网络使用的说明