【 tulaoshi.com - Java 】
                             
                                         依赖注入(Dependency Injection),又称作控制反转(IOC),本来是一种设计模式,现在被吵得热火朝天,有点过了。比较有名项目如String,picoContainer等。 
  在EJB3.0中,可以通过在字段和设置方法上加上注释注入依赖,我想在很快会有新的项目,或者在原来的项目的基础上,一些IOC容器会采用注释的方式注入依赖,JDK5.0加入的注释的确是一个很强大的功能,相对而言,在.net中的属性却没有发挥那么大的价值。这就是开源的威力,成千上万的在开源java程序员不断涌现出新的想法新的功能。 
  看下面的例子:我们知道,JBOSS中已经默认配置了一个数据源,它的JNDI名称是"java:/DefaultDS"。下面这个例子声明了一个数据源,通过注释,就可以将JBOSS的这个默认的数据源赋值给它。 
  @Resource(jndiName="java:/DefaultDS") 
  public DataSource customerDB; 
  Resource注释的声明 
  @Target({TYPE, METHOD, FIELD, PARAMETER}) @Retention(RUNTIME) 
  public @interface Resource { 
  String name() default ""; 
  String resourceType() default ""; 
  AuthenticationType authenticationType() default CONTAINER; 
  boolean shareable() default true; 
  String jndiName() default ""; 
  } 
  public enum Authentication Type { 
  CONTAINER, 
  APPLICATION 
  } 
  @Target(TYPE) @Retention(RUNTIME) 
  public @interface Resources { 
  Resource[] value(); 
  } 
  Resource的name指向一个在环境属性中命名的资源,AuthenticationType用来指定是容器还是EJB组件来进行身份验证,sharebale指定是否共享,jndiName用来指定JDNI中的名称。resourceType()用来指定资源的类型。 
  如果name和resourceType都指向被注释的程序成员,AuthenticationType和resourceType都是缺省的,则可以使用Inject注释: 
  @Inject(jndiName="java:/DefaultDS") 
  public DataSource customerDB; 
  对于单例的成员,你可以更简化: 
  @Inject javax.ejb.SessionContext ctx; 
  @Inject javax.ejb.TimerService timer; 
  @Inject javax.ejb.UserTransaction ut; 
  @Inject javax.ejb.EntityManager manager; 
  Resources注释可以注入多个资源。 
  在Eclipse中导入本文提供的例子DI。 
  这个例子从数据库中读取JMS_USER表,并显示表中的内容。这个例子使用依赖注入的方式得到JBOSS默认的数据源。 
  这个例子主要有5个文件: 
   JmsUsers.java:业务接口。 
   JmsUsersBean.java:业务实现类。将来我们开发的EJB也都是这样命名(在接口名上加上Bean)。 
   Client.java:测试EJB的客户端类。 
   jndi.properties:jndi属性文件,提供访问jdni的基本配置属性。 
   Build.xml:ant 配置文件,用以编译、发布、测试、清除EJB。 
  下面针对每个文件的内容做一个介绍。 
  JmsUsers.java 
  package com.kuaff.ejb3.di; 
  import java.util.List; 
  import javax.ejb.Remote; 
  import javax.sql.*; 
  @Remote 
  public interface JmsUsers 
  { 
  public List
 getUsers(); 
  } 
  这个接口很简单,定义了一个得到全部用户的方法,JBOSS默认使用接口的全称作为它的JNDI名。在上面的例子中,它的全称可以通过JmsUsers.class。getName()得到。 
  CounterBean.java 
  package com.kuaff.ejb3.di; 
  import java.util.List; 
  import java.util.ArrayList; 
  import javax.ejb.Stateless; 
  import javax.ejb.Resource; 
  import javax.sql.*; 
  import java.sql.*; 
  @Stateless 
  public class JmsUsersBean implements JmsUsers 
  { 
  @Resource(jndiName="java:/DefaultDS",resourceType="javax.sql.DataSource") 
  public DataSource customerDB; 
  public List getUsers() 
  { 
  List list = new ArrayList(); 
  try 
  { 
   Connection conn = customerDB.getConnection(); 
   Statement st = conn.createStatement(); 
   ResultSet rs = st.executeQuery("select * from jms_users"); 
   while(rs.next()) 
   { 
    list.add(rs.getString("userid")); 
   } 
  } 
  catch(SQLException e) 
  {} 
  return