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配置文件就只需加载一次即可!