依赖注入(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<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。
分享到:
相关推荐
依赖注入(Dependency Injection,简称DI)是Java编程中一种重要的设计模式,特别是在企业级Java应用(Enterprise JavaBeans,EJB)3.0版本中得到了广泛的应用。依赖注入的核心思想是解耦,它允许开发者在不修改代码...
### EJB3.0开发指南知识点详解 #### 一、EJB3.0概述与特点 EJB(Enterprise JavaBeans)3.0是Java EE平台的一部分,用于构建可移植、健壮、重用性强的企业级应用程序。相比于之前的版本,EJB 3.0引入了大量的简化...
5. 依赖注入:EJB 3.0引入了依赖注入(Dependency Injection,DI)的概念,如@Autowired和@Resource,使得组件之间的关联可以通过容器自动管理,减少了手动装配的工作。 6. 无状态和有状态会话Bean:@Stateless和@...
3. **ejb3.0-1.pdf** - 这可能是EJB 3.0的特定部分或专题教程,比如可能专门讲解新的JPA(Java Persistence API)或者EJB 3.0的容器服务,如依赖注入、声明式事务管理等。 4. **EJB3.rar** - 这个RAR文件可能包含源...
4. **依赖注入**:EJB3.0引入了依赖注入,使得组件之间可以通过接口进行协作,而无需硬编码引用。@EJB、@Inject和@Resource注解分别用于注入EJB、CDI(Contexts and Dependency Injection)和资源。 5. **容器管理...
**ejb3.0中英文规范** Enterprise JavaBeans (EJB) 3.0是Java平台上企业级应用程序开发的重要组成部分,它提供了服务器端组件模型,用于构建可扩展、安全且可移植的分布式业务应用程序。EJB 3.0规范旨在简化开发...
4. **依赖注入**:EJB 3.0利用Java Dependency Injection (JSR 330)标准,如`@Inject`和`@Named`,实现了依赖查找和注入,降低了组件之间的耦合度。 5. **查询语言JPA QL**:EJB 3.0引入了JPQL(Java Persistence ...
4. **依赖注入(Dependency Injection,DI)**:EJB 3.0引入了JSR 330规范,支持依赖注入,允许容器自动管理Bean之间的依赖关系,降低了代码的耦合度。 5. **注解(Annotations)**:EJB 3.0大量使用注解,如`@...
EJB3.0相比之前的版本,引入了许多简化开发过程的特性,例如注解、依赖注入和改进的消息驱动Bean。 #### 运行环境配置 配置EJB3.0的运行环境,首先需要下载并安装JBoss服务器。JBoss是支持EJB3.0规范的开源应用...
EJB 3.0支持JSR 330规范的依赖注入,允许bean之间通过`@Inject`注解来声明和注入依赖。这有助于降低组件之间的耦合度,提高代码的可测试性和可维护性。 **6. 事务管理** EJB 3.0提供了强大的事务管理能力。开发者...
与前一版本相比,EJB3.0引入了许多简化开发流程的新特性,如注解驱动的配置、无接口视图、依赖注入等,极大地提高了开发效率和组件的可维护性。 ### 主要特性解析 #### 注解驱动的配置 EJB3.0允许使用注解来定义...
《最新EJB3.0教程》是一份详尽的指南,专为希望深入了解Java企业级应用程序接口(EJB)3.0版本的开发者设计。EJB3.0是Java平台企业版(J2EE)的一部分,旨在简化企业级Java应用程序的开发过程,通过提供组件模型来支持...
EJB (Enterprise JavaBeans) 3.0 是一种Java企业级应用的标准规范,它简化了EJB 2.x 版本中复杂的编程模型,引入了许多新特性,如依赖注入、增强的会话Bean支持、简化实体Bean模型等。本文档主要基于《JbossEJB3.0...
- 如何在EJB3.0中利用注解自动完成依赖注入。 - **定时服务 (Timer Service)**: - 介绍如何利用EJB3.0提供的定时服务功能实现任务调度。 - **安全服务 (Security Service)**: - 详述EJB3.0的安全模型和认证...
通过对上述知识点的深入学习,开发者不仅能够理解 EJB3.0 的基础概念和技术细节,还能够掌握如何在实际项目中有效地利用 EJB3.0 进行高效的企业级应用开发。这将有助于提升项目的质量和开发效率,同时也能更好地应对...