依赖注入(dependency injection),又称作控制反转(ioc),本来是一种设计模式,现在被吵得热火朝天,有点过了。比较有名项目如string,picocontainer等。
在ejb3.0中,可以通过在字段和设置方法上加上注释注入依赖,我想在很快会有新的项目,或者在原来的项目的基础上,一些ioc容器会采用注释的方式注入依赖,jdk5.0加入的注释的确是一个很强大的功能,相对而言,在.net中的属性却没有发挥那么大的价值。这就是开源的威力,成千上万的在开源java程序员不断涌现出新的想法新的功能。
看下面的例子:我们知道,jboss中已经默认配置了一个数据源,它的jndi名称是"java:/defaultds"。下面这个例子声明了一个数据源,通过注释,就可以将jboss的这个默认的数据源赋值给它。
resource的name指向一个在环境属性中命名的资源,authenticationtype用来指定是容器还是ejb组件来进行身份验证,sharebale指定是否共享,jndiname用来指定jdni中的名称。resourcetype()用来指定资源的类型。
如果name和resourcetype都指向被注释的程序成员,authenticationtype和resourcetype都是缺省的,则可以使用inject注释:
对于单例的成员,你可以更简化:
resources注释可以注入多个资源。
在eclipse中导入本文提供的例子di。
这个例子从数据库中读取jms_user表,并显示表中的内容。这个例子使用依赖注入的方式得到jboss默认的数据源。
这个例子主要有5个文件:
jmsusers.java:业务接口。
jmsusersbean.java:业务实现类。将来我们开发的ejb也都是这样命名(在接口名上加上bean)。
client.java:测试ejb的客户端类。
jndi.properties:jndi属性文件,提供访问jdni的基本配置属性。
build.xml:ant 配置文件,用以编译、发布、测试、清除ejb。
下面针对每个文件的内容做一个介绍。
这个接口很简单,定义了一个得到全部用户的方法,jboss默认使用接口的全称作为它的jndi名。在上面的例子中,它的全称可以通过jmsusers.class。getname()得到。
这个是业务逻辑的具体实现。一旦这个ejb被容器产生,则容器将jboss的数据源注入到customerdb变量上,所以不要以为customerdb没有被初始化,这些工作是容器做的。
这个类用来测试我们发布的ejb组件。显示从jms_users表中读取的数据。
请运行{$jboss_home}/bin目录下的run.bat: run ?call,启动jboss。
在eclipse的ant视图中执行ejbjar target。或者在命令行下,进入到此工程目录下,执行ant ejbjar,将编译打包发布此ejb
在eclipse的ant视图中执行run target。或者在命令行下,进入到此工程目录下,执行ant run,测试这个ejb。
在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<string> 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<string> getusers() { list<string> list = new arraylist<string>(); 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 list; } } |
这个是业务逻辑的具体实现。一旦这个ejb被容器产生,则容器将jboss的数据源注入到customerdb变量上,所以不要以为customerdb没有被初始化,这些工作是容器做的。
| client.java package com.kuaff.ejb3.di; import java.util.list; import javax.naming.initialcontext; import javax.naming.namingexception; public class client { public static void main(string[] args) { initialcontext ctx; try { ctx = new initialcontext(); jmsusers users = (jmsusers) ctx.lookup(jmsusers.class.getname()); list<string> jmsusers = users.getusers(); for(string user:jmsusers) { system.out.printf("用户名:%s%n",user); } } catch (namingexception e) { e.printstacktrace(); } } } |
这个类用来测试我们发布的ejb组件。显示从jms_users表中读取的数据。
请运行{$jboss_home}/bin目录下的run.bat: run ?call,启动jboss。
在eclipse的ant视图中执行ejbjar target。或者在命令行下,进入到此工程目录下,执行ant ejbjar,将编译打包发布此ejb
在eclipse的ant视图中执行run target。或者在命令行下,进入到此工程目录下,执行ant run,测试这个ejb。
闽公网安备 35060202000074号