`
jamjar
  • 浏览: 14291 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

Spring访问EJB3.0的SessionBean方法

阅读更多

Spring2.*提供了一个访问EJB的方法,即

“org.springframework.ejb.access.LocalStatelessSessionProxyFactoryBean”和

“org.springframework.ejb.access.SimpleRemoteStatelessSessionProxyFactoryBean”

两个FactoryBean,一个用来访问本地的,一个用来访问远程的无状态SessionBean。但是这两个FactoryBean

只能针对EJB2.0的无状态SessionBean,所以在配置是必须提供SessionBean的Home接口。而在EJB3.0中已经没有了Home接口(或者说被隐藏起来了)。为了访问EJB3.0的无状态Session Bean就只好自己写一个了。

package com.cyf.spring.ext;



import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.jndi.JndiTemplate;

public class SlsbFactoryBean implements FactoryBean {
  
   private static Logger log=Logger.getLogger(SlsbFactoryBean.class);
   private JndiTemplate jndiTemplate;
    private Context ejbCtx;
    private String jndiName;
    private Object ejbobj;
    public synchronized Object getEjbObject(){
    	if (ejbobj==null){
    		if (jndiTemplate == null || jndiTemplate.getEnvironment() == null) {
				throw new LookupSlsbException("jndiTemplate is required!");
			}
			try {
				ejbCtx = new InitialContext(jndiTemplate.getEnvironment());
			} catch (Exception e) {
				throw new LookupSlsbException(
						"can't initial a javax.naming.InitialContext ");
			}
			if (jndiName==null){
				throw new LookupSlsbException("jndiName is required!");
			}
			try {
				ejbobj=ejbCtx.lookup(jndiName);
				return ejbobj;
			} catch (NamingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				return null;
			}
    	}else{
    		return ejbobj;
    	}
    }          
	public Object getObject() throws Exception {
		// TODO Auto-generated method stub
        return getEjbObject();		
	}

	public Class getObjectType() {
		// TODO Auto-generated method stub
		return null;
	}

	public boolean isSingleton() {
		// TODO Auto-generated method stub
		return false;
	}

	public JndiTemplate getJndiTemplate() {
		return jndiTemplate;
	}

	public void setJndiTemplate(JndiTemplate jndiTemplate) {
		log.info("setting jndiTemplate....");
		this.jndiTemplate = jndiTemplate;
	}

	public String getJndiName() {
		return jndiName;
	}

	public void setJndiName(String jndiName) {
		log.info("setting jndiName");
		this.jndiName = jndiName;
	}


}

这个类实现了Spring的FactoryBean接口

/*
 * Copyright 2002-2007 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.beans.factory;

/**
 * Interface to be implemented by objects used within a {@link BeanFactory}
 * which are themselves factories. If a bean implements this interface,
 * it is used as a factory for an object to expose, not directly as a bean
 * instance that will be exposed itself.
 *
 * <p><b>NB: A bean that implements this interface cannot be used as a
 * normal bean.</b> A FactoryBean is defined in a bean style, but the
 * object exposed for bean references is always the object that it creates.
 *
 * <p>FactoryBeans can support singletons and prototypes, and can
 * either create objects lazily on demand or eagerly on startup.
 *
 * <p>This interface is heavily used within the framework itself, for
 * example for the AOP {@link org.springframework.aop.framework.ProxyFactoryBean}
 * or the {@link org.springframework.jndi.JndiObjectFactoryBean}.
 * It can be used for application components as well; however,
 * this is not common outside of infrastructure code.
 *
 * @author Rod Johnson
 * @author Juergen Hoeller
 * @since 08.03.2003
 * @see org.springframework.beans.factory.BeanFactory
 * @see org.springframework.aop.framework.ProxyFactoryBean
 * @see org.springframework.jndi.JndiObjectFactoryBean
 */
public interface FactoryBean {

	Object getObject() throws Exception;

	
	Class getObjectType();

	
	boolean isSingleton();

}

请注意FactoryBean的“getObject()”方法,这个方法将会在Spring客户端调用ApplicationContext.getBean()的时候被调用,或者说getObject()代理了getBean()方法,下面将会看一个例子。所以我在getObject()方法中去lookup EJB3.0的sessionbean。

再来看下Spring配置文件。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
	<bean id="propertyConfigurer"
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="location">
			<value>WEB-INF/classes/jndi.properties</value>
		</property>
	</bean>
	<bean id="jndiTemplate"
		class="org.springframework.jndi.JndiTemplate">
		<property name="environment">
			<props>
				<prop key="java.naming.provider.url">
					${java.naming.provider.url}
				</prop>
				<prop key="java.naming.factory.initial">
					${java.naming.factory.initial}
				</prop>
				<prop key="java.naming.factory.url.pkgs">
					${java.naming.factory.url.pkgs}
				</prop>
			</props>
		</property>
	</bean>
	<bean id="RemoteDAO" class="com.cyf.spring.ext.SlsbFactoryBean">
		<property name="jndiTemplate">
			<ref local="jndiTemplate" />
		</property>
		<property name="jndiName" value="CommonDAOImpl/remote" />
	</bean>
</beans>

SlsbFactoryBean只需要设置jndi属性模板和jndiName,不需要EJB2.0的home接口了

调用的例子:

package com.cyf.spring.ext;

import java.util.List;

import javax.faces.context.FacesContext;

import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContext;
import org.springframework.web.jsf.FacesContextUtils;

import com.book.business.CommonDAO;
import com.bookstore.admin.actions.PressAction;

public class TestSlsbFactoryBean {
 //在JSF环境中得到SpringApplicationContext
 private static ApplicationContext ctx = FacesContextUtils
   .getWebApplicationContext(FacesContext.getCurrentInstance());
 private static Logger log = Logger.getLogger(TestSlsbFactoryBean.class);

 public void testBean() {
  //getBean(RemoteDAO)返回的结果就是调用SlsbFactoryBean.getObject()方法返回的结果
  CommonDAO dao = (CommonDAO)ctx.getBean("RemoteDAO");
  List list = dao.getObjByEQL("select count(p) from Press p", null, -1, -1);
  long size = (Long) list.get(0);
  log.info(size);
 }
}

 

 

分享到:
评论
1 楼 duooluu 2008-06-29  
这样做没必要吧
直接用JndiObjectFactoryBean
或者
<jee:jndi-lookup id="RemoteDAO"
   jndi-name="CommonDAOImpl/remote" 
   environment-ref="environment"/>

相关推荐

    精通ejb3.0 经典书目

    ### 精通EJB3.0经典书目解析 #### 一、书籍基本信息 - **书名**:《精通企业级Java Beans (EJB) 3.0》 - **作者**:Rima Patel Sriganesh, Gerald Brose, Micah Silverman - **出版社**:Wiley Publishing, Inc. -...

    EJB3.0__EJB3.0

    EJB3.0是EJB规范的一个重要版本,它引入了许多简化开发的特性,使得EJB更加易用。 EJB3.0的核心概念包括: 1. **Session Bean**: - **有状态Session Bean(Stateful Session Bean)**:每个客户端会话对应一个...

    EJB3.0详解

    一个基于Struts+EJB3.0的应用通常具有三层架构:表现层(Presentation Layer)、业务逻辑层(Business Logic Layer,由EJB3.0的会话Bean构成)和数据访问层(Data Access Layer,由实体Bean组成)。这种结构确保了...

    EJB3.0 实例编程

    EJB3.0支持基于角色的访问控制(RBAC),可以通过`@RolesAllowed`注解来限制对特定方法的访问权限,确保了应用程序的安全性。 8. **生命周期回调** EJB3.0允许开发者通过`@PostConstruct`和`@PreDestroy`注解定义...

    spring与ejb的区别

    注解**:Spring框架通常使用XML文件来配置bean和其他组件,而EJB3.0则倾向于使用注解来定义组件行为。这两种方式都有各自的优点,但在灵活性和可读性方面,Spring的XML配置文件可能会更具优势。 - **声明性服务**:...

    EJB3.0 in Action

    此外,EJB 3.0还支持轻量级的容器管理(Container-Managed Persistence,CMP)和事务管理,以及简化了消息驱动bean(Message-Driven Bean)的创建。 ### 第一章:EJB 3.0概述 本章将全面介绍EJB 3.0的新特性,包括...

    最新EJB 3.0实例教程

    EJB可以是会话bean(Session Beans)、实体bean(Entity Beans)或消息驱动bean(Message-Driven Beans)。使用IDE如Eclipse或IntelliJ IDEA可以方便地进行这些操作。 **3. 数据库操作** EJB 3.0引入了实体bean的...

    EJB3.0教程

    "ejb3.0实例教程.pdf"和"EJB3_Basic.pdf"等文档将涵盖实际的开发案例,帮助读者更好地理解和应用EJB 3.0技术。 总之,EJB 3.0教程旨在为初学者和经验丰富的开发者提供全面的指导,帮助他们掌握这个强大的企业级Java...

    ejb调用详解

    **五、ejb3.0无状态会话Bean(Stateless Session Bean)** 无状态会话Bean不维护任何会话状态,每个请求都是独立的。它们通过`@Stateless`注解标识,适合于执行简单的、不依赖上下文的操作。客户端可以通过`@EJB`...

    ajax、spring、ejb试题

    15. EJB3.0 中 Session Bean 的组成可以包括 Remote interface、Local home interface、Local interface、ejb-jar.xml、Bean class 等。 16. EJB3.0 中 Entity Bean 的组成可以包括 Primary key class、Local home ...

    ejb.rar_ejb

    7. **异步方法调用**:EJB 3.1(EJB 3.0的后续版本)引入了异步方法调用,允许Bean方法在后台线程中执行,从而提高了系统的并发性能。 8. **Web服务支持**:EJB 3.0开始支持Web服务,可以通过JAX-WS(Java API for ...

    EJB3学习入门.zip

    - **会话Bean(Session Bean)**:处理业务逻辑,提供方法供客户端调用。会话Bean分为无状态会话Bean和有状态会话Bean,前者不维护客户端状态,后者则可以。 - **消息驱动Bean(Message-Driven Bean)**:处理JMS...

    struts2+spring+ejb3源代码(完整版)

    实体Bean(Entity Bean)用于持久化数据,会话Bean(Session Bean)则用于业务逻辑处理。EJB3还提供了注解驱动的开发方式,减少了XML配置。 在`struts2ejb.jar`和`s2sejbjar`中,可能包含了Struts2和EJB3的集成代码...

    Ejb 3 In Action

    - **会话Bean类型**:介绍了会话Bean的不同类型,如Stateless Session Bean、Stateful Session Bean以及Singleton Session Bean。 - **业务逻辑实现**:展示了如何在会话Bean中实现具体的业务逻辑处理。 #### 第四...

    EJB技术的介绍

    在EJB3.0之后,实体Bean的使用更加简化,通常采用注解的方式来进行O/R映射。 3. 消息驱动Bean(Message-Driven Bean,MDB):这是EJB2.0引入的新类型,主要用于处理Java消息服务(JMS)的消息。MDB是无状态的,它们...

    EJB,有状态,无状态,实体bean笔记,及例子

    这使得无状态session bean非常适合执行计算任务或访问数据库,而不需要跟踪用户会话中的信息。 2. **有状态Session Bean** 与无状态session bean相反,有状态session bean保留了客户端会话的上下文。它们可以记住...

    ejb3+spring+struts实现简单银行系统

    - 通过Struts2的Action,用户请求会被映射到具体的业务处理方法,这些方法可能调用了Spring管理的Service层,Service层又进一步调用了EJB3的Bean来执行实际的业务逻辑。 - 事务管理方面,Spring提供了声明式事务管理...

    EJB 实例 shop

    1. **业务逻辑层(EJB组件)**:这部分通常由`storeProject`代表,其中包含实体Bean(Entity Beans)和会话Bean(Session Beans)。实体Bean用于持久化数据,它们与数据库交互,模拟了对象关系映射(ORM)的概念。...

    j2ee学习笔记.rar

    实体Bean(Entity Beans)用于持久化数据,会话Bean(Session Beans)则用于处理业务逻辑。同时,注解的引入使得EJB配置更加简洁,无需大量的XML配置文件。 这些技术的综合运用能够构建出高效、可扩展的企业级应用...

Global site tag (gtag.js) - Google Analytics