你已经学到了如何开发藕合松散的服务组件。但是,为了存取那些服务对象,你需要通过服务器的JNDI 来查
找存根对象(session bean)或消息队列(MDB)。JNDI 查找是把客户端与 际的服务端 现解藕的关键步骤。但
是,直接使用一个字符串来进行JNDI 查找并不优雅。有这样几个原因:
·客户端与服务端必须有一致的基于字符串的名字。它没有在编译时得到认证或在布署时得到检查。
·从JNDI 返回的服务对象的类型没有在编译时进行检查,有可能在运行时出现转换(casting)错误。
·冗长的查找代码,有着自己的try-catch 代码块,在应用之间是重复的和杂乱的
EJB 3.0,对任何POJO,提供了一个简单的和优雅的方法来解藕服务对象和资源。使用@EJB 注释,你可以将EJB
存根对象注入到任何EJB 3.0 容器管理的POJO 中。如果注释用在一个属性变量上,容器将会在它被第一次访问
之前赋值给它。在Jboss 下一版本中@EJB 注释从javax.annotation 包 到了javax.ejb 。
下面的例子演示了怎样把HelloWorldBean 无状态session bean 的存根注入到InjectionBean 类中。 package com.foshanshop.ejb3.impl;
import com.foshanshop.ejb3.HelloWorld; import com.foshanshop.ejb3.Injection; import javax.ejb.EJB; import javax.ejb.Remote; import javax.ejb.Stateless; @Stateless @Remote ({Injection.class}) public class InjectionBean implements Injection { @EJB (beanName="HelloWorldBean") HelloWorld helloworld; //类似于以下代码 // private HelloWorld helloworld = new HelloWorldBean(); public String SayHello() { return helloworld.SayHello("注入者"); } }
附需要注入的 HelloWorldBean 对象代码 :
package com.foshanshop.ejb3; public interface HelloWorld { public String SayHello(String name); }package com.foshanshop.ejb3.impl;
import com.foshanshop.ejb3.HelloWorld; import javax.ejb.Remote; import javax.ejb.Stateless; @Stateless @Remote ({HelloWorld.class}) public class HelloWorldBean implements HelloWorld { public String SayHello(String name) { return name +"hello ejb"; } }
@EJB注释的beanName属性指定EJB的类名(不带包名),他的另一个属性mappedName指定Bean实例的JNDI名。
下面的片断演示了如何使用beanName或mappedName属性查找 HelloWorldBean 会话 bean
public class InjectionBean implements Injection { @EJB (beanName="HelloWorldBean") //@EJB (mappedName="HelloWorldBean/remote") HelloWorld helloworld; …..
@EJB注释如果被用在JavaBean风格的setter 方法上时,容器会在属性第一次使用之前,自动地用正确的参数调
用bean的setter 方法。下面的片断演示了这是如何做的
public class InjectionBean implements Injection { HelloWorld helloworld; @EJB (beanName="HelloWorldBean") public void setHelloworld(HelloWorld helloworld) { this.helloworld = helloworld; } …..
@EJB注释只能注入EJB存根对象,除@EJB注释之外,EJB 3.0也支持@Resource注释来注入来自JNDI的任何
资源。下面的例子中演示了如何注入数据源。"java:/DefaultMySqlDS"是数据源 DefaultMySqlDS的全局JNDI名。
有关数据源的配置请参考后面章节“JBoss数据源的配置”
@Stateless @Remote ({Injection.class}) public class InjectionBean implements Injection { @EJB (beanName="HelloWorldBean") HelloWorld helloworld; @Resource (mappedName="java:/DefaultMySqlDS") Jboss EJB3.0实例教程 版权所有:黎活明 DataSource myDb; public String SayHello() { String str = ""; try { Connection conn = myDb.getConnection(); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT studentName FROM student"); if (rs.next()) { str = rs.getString(1); } rs.close(); stmt.close(); } catch (SQLException e) { e.printStackTrace(); } return helloworld.SayHello(str); } }