EJB学习(五)——依赖注入

    一、Why?

我们在客户端调用服务端对象的时候,通常需要通过服务器的 JNDI 来查找session bean或MDB。JNDI 查找是把客户端与实际的服务端实现解藕的关键步骤。 但是, 直接使用一个字符串来进行 JNDI 查找并不优雅。有这样几个原因:

· 客户端与服务端必须有一致的基于字符串的名字。 它没有在编译时得到认证或在部署时得到检查。

· 从 JNDI 返回的服务对象的类型没有在编译时进行检查, 有可能在运行时出现转换(casting)错误。

· 冗长的查找代码,有着自己的 try-catch 代码块,在应用之间是重复的和杂乱的EJB 3.0,对任何 POJO,提供了一个简单的和优雅的方法来解藕服务对象和资源。

由于以上原因,便有了我们的EJB依赖注入。

    二、How?

    1.注入Session Bean

注入Session Bean有四种方式:

[1] beanInterface:指被注入属性EJB所实现的接口。

[2] name:被注入Bean在JNDI ENC中注册的名称,不同服务器存在不同的差异.

[3] beanName:指定EJB的名称(如果@Stateless或@Stateful没有设置过name属性,默认为不带包名的类名)

[4] mappedName:被注入EJB的JNDI名,不同服务器存在不同的差异.

举例:通过beanName注入

①本地接口和实现类:

//本地接口
public interface HelloWorld {

	public String sayHello(String name);
}

//本地接口实现Bean
@Stateless(name="HelloWorld")
@Local({HelloWorld.class})
public class HelloWorldBean implements HelloWorld {

	@Override
	public String sayHello(String name) {

		return name+"欢迎使用EJB3.0~~";
	}
}

②远程接口和实现类:

//远程接口
public interface CallHello {

	public String sayHello(String name);
}

//远程接口实现类
@Stateless
@Remote({CallHello.class})
public class CallHelloBean implements CallHello {

	@EJB(name="HelloWorld")
//	@EJB(mappedName="HelloWorld/local")
	private HelloWorld helloWorld;

	@Override
	public String sayHello(String name) {
		String result =  helloWorld.sayHello("江霄");
		System.out.println("EJB注入成功:"+result);
		return result;
	}
}

③客户端调用:

public class Client {
	public static void main(String[] args) throws NamingException {

		InitialContext initialContext = new InitialContext();
		CallHello ejb = (CallHello) initialContext
				.lookup("CallHelloBean/remote");

		String name = ejb.sayHello("周江霄");
		System.out.println(name);
	}
}

注意:注释也可以被用在JavaBean风格的setter方法上,效果是相同的。还有一点就是JavaBean的的@Stateful或者@Stateless注释的"mappedName"的属性可以改变JavaBean的JNDI名称,例如@Stateful(mappedName="123"),那么通过JNDI调用就是这样的:

CallHello ejb = (CallHello) initialContext.lookup("123");

    2.注入Resource

@EJB注释只能注入EJB存根对象,除@EJB注释之外, EJB 3.0也支持@Resource注释来注入来自JNDI的任何

资源。下面的例子中演示了如何注入数据源。"java:/DefaultMySqlDS"是数据源 DefaultMySqlDS的全局JNDI名。

@Stateless
@Remote( { Injection. class })
public class InjectionBean implements Injection {
@EJB(beanName = "HelloWorldBean")
HelloWorld helloworld;
@Resource(mappedName = "java:/DefaultMySqlDS")
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);
}
}

总结:刚开始学习EJB注入的是时候,被几个name、mappedName、beanName搞混了,然后就自己动手敲了个Demo,在实践中验证自己的想法,这样往往比只停留在理论上要理解的深刻。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 02:17:15

EJB学习(五)——依赖注入的相关文章

spring学习 五 依赖注入的方式

依赖注入有两种方式: 1 构造注入,如果<bean>标签下使用<contructor-arg>,则是构造注入 2 setter注入,就是调用setter方法注入,如果<bean>标签下使用<property>标签,就是setter注入 2.1: 如果属性是基本数据类型或 String 等简单类型 <bean id="peo" class="com.bjsxt.pojo.People"> <proper

Spring.Net学习笔记五(依赖注入)

谈到高级语言编程,我们就会联想到设计模式:谈到设计模式,我们就会说道怎么样解耦合.而Spring.NET的IoC容器其中的一种用途就是解耦合,其最经典的应用就是:依赖注入(Dependeny Injection)简称DI,目前DI是最优秀的解耦方式之一.下面我就来谈谈依赖注入的应用场景. 我模拟了三种不同的场景,可以一起学习使用依赖注入的重要性. 下面是应用场景的条件:人类使用工具劳动.      /**//// <summary> /// 抽象人类 /// </summary>

会话EJB系列(六)依赖注入

在本文的开始之前,先给大家介绍一个概念"依赖". 什么是依赖呢? 简单的说,就是A组件需要调用B组件,B组件需要调用C组件,C组件需要调用D组件-..这种调用称为:依赖! 在最早的应用程序中,依赖关系时通过new关键字来实现的.A组件依赖B组件,就是在A组件中显示的new一个B组件.缺点: 1.硬编码,耦合性强,难以维护.A组件只需要B组件中的方法,不必关心B组件的创建问题! 2.频繁的创建对象,导致系统开销增大. 上面的这种缺点,直接催生了'工厂模式'. 在工厂模式中,A组件依赖B组

Spring 3.0 学习-DI 依赖注入_创建Spring 配置-使用一个或多个XML 文件作为配置文件,使用自动注入(byName),在代码中使用注解代替自动注入,使用自动扫描代替xml中bea

文章大纲 在xml中声明bean和注入bean 在xml中声明bean和自动注入bean 自动扫描bean和自动注入bean 对自动扫描bean增加约束条件 首次接触spring请参考 Spring 3.0 学习-环境搭建和三种形式访问 1.典型的Spring XML 配置文件表头 <?xml version="1.0" encoding="UTF-8"?><!-- 一般化的Spring XML 配置 --> <beans xmlns=

Spring学习——DI(依赖注入)

IOC容器,处理对象依赖关系 IOC与DI: IOC :是一个容器,创建对象的容器 DI :在容器创建对象后,处理对象的依赖关系,也叫依赖注入! 方式1:通过set方法注入值 可以给普通属性.集合属性注入值: 1. 必须提供set方法 2. 配置中通过bean的property子节点,给对象属性注入值: 1 <!-- 2 依赖注入,即处理对象的依赖关系!给对象的属性设置值! 3 --> 4 <!-- 1) 给对象属性赋值(通过构造函数)--> 5 <bean id="

AngulerJS学习(二) 依赖注入

简介: 首先我们需要理解什么是依赖注入? 控制反转和依赖注入有什么区别? 假定:应用程序A,需要访问外部资源C.这里使用了容器B(是指用来实现 IOC/DI 功能的一个框架程序). A需要访问C B获取C然后返回给A IOC inversion of control 控制反转:站在容器角度.B控制A,由B反向的向A注入C.即容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源. DI Dependency Injection 依赖注入:站在应用程序的角度.A依赖B获取C,B将C注

AngularJS学习之依赖注入

1.什么是依赖注入:简称DI,是一种软件设计模式,在这种模式下,一个或更多的依赖(或服务)被注入(或者通过引用传递)到一个独立的对象(或客户端)中,然后成为了该客户端状态的一部分. 该模式分离了客户端依赖本身行为的创建,这使得程序设计变得松耦合,并遵循了依赖反转和单一的职责原则,与服务定位器模式形成直接对比的是,它允许客户端了解如何使用系统找到依赖: 2.一句话:没事你不要来找我,有事我会去找你: 3.AngularJS提供了很好地依赖注入,以下5个核心组件用来作为依赖注入: **Value:一

SSH学习九 依赖注入

依赖注入(DI)和控制反转(IoC),意思是一样的 传统方式中,如果JAVA实例A需要另一个实例B,那么需要new B(),然后给A用,也就是有调用者A创建被调用者B的实例 依赖注入模式下:创建被调用者B的工作不再由A完成,而是由Spring容器完成(或者说工厂模式的工厂完成),然后注入调用者,因此也成为依赖注入,因为A和B是依赖关系. 依赖注入有两种方式: (1)设值注入 Spring通过Set方法为类A的成员注入值. (2)构造注入 通过构造器注入. 例子如下: 代码逻辑: Service通

spring学习笔记-依赖注入

学习过程访问的地址,按顺序理解: [email protected]注解与自动装配 spring四种依赖注入方式 Spring注解注入 <context:component-scan>使用说明 详细:Spring零配置通过注解实现Bean依赖注入总结

angularjs学习:依赖注入

1. AngularJS使用 $injetor(注入器服务)来管理依赖关系的查询和实例化.事实上, $injetor负责实例化AngularJS中所有的组件,包括应用的模块.指令和控制器等.在运行时, 任何模块启动时$injetor都会负责实例化,并将其需要的所有依赖传递进去. 以在需要的地方通过参数进行传递的方式来进行依赖注入的. 在内部, AngularJS的处理过程是下面这样的: // 使用注入器加载应用 var injector = angular.injector(['ng', 'my