依赖注入(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(); } |
| @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; |
| 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(); } |
| 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; } } |
| 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(); } } } |
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器