EJB3.0之-------依赖注入(dependency injection)

       你已经学到了如何开发藕合松散的服务组件。但是,为了存取那些服务对象,你需要通过服务器的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); 
     } 
}
 

猜你喜欢

转载自wlt2008-com.iteye.com/blog/1732582