EJB学习笔记_10_依赖注入(beanname注入)

我们在客户端调用服务端对象的时候,通常需要通过服务器的 JNDI 来查找session bean或MDB。JNDI 查找是把客户端与实际的服务端实现解藕的关键步骤。 但是, 直接使用一个字符串来进行 JNDI 查找并不优雅。有这样几个原因:
    · 客户端与服务端必须有一致的基于字符串的名字。 它没有在编译时得到认证或在部署时得到检查。
    · 从 JNDI 返回的服务对象的类型没有在编译时进行检查, 有可能在运行时出现转换(casting)错误。
    · 冗长的查找代码,有着自己的 try-catch 代码块,在应用之间是重复的和杂乱的EJB 3.0,对任何 POJO,提供了一个简单的和优雅的方法来解藕服务对象和资源。

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


注入SessionBean有如下四种方式:

    [1] beanInterface:指被注入属性EJB所实现的接口。
    [2] name:被注入Bean在JNDI ENC中注册的名称,不同服务器存在不同的差异.
    [3] beanName:指定EJB的名称(如果@Stateless或@Stateful没有设置过name属性,默认为不带包名的类名) 
    [4] mappedName:被注入EJB的JNDI名,不同服务器存在不同的差异.


beanName注入举例如下:

本地接口和类

package com.manfred.ejb;

public interface HelloWorld {
	public String sayHello(String name);
}

package com.manfred.ejb.impl;

import javax.ejb.Local;
import javax.ejb.Stateless;

import com.manfred.ejb.HelloWorld;
@Stateless(name="HelloWorld")
@Local({HelloWorld.class})
public class HelloWorldBean implements HelloWorld {

	public String sayHello(String name) {
		return name + "欢迎使用EJB3.0";
	}

}

远程接口和实现类

package com.manfred.ejb;

public interface CallHello {
	public String say(String name);
}

package com.manfred.ejb.impl;

import javax.ejb.EJB;
import javax.ejb.Remote;
import javax.ejb.Stateless;

import com.manfred.ejb.CallHello;
import com.manfred.ejb.HelloWorld;
@Stateless
@Remote({CallHello.class})
public class CallHelloBean implements CallHello {
	@EJB(name="HelloWorld")
	private HelloWorld helloWorld;
	
	public String say(String name) {
		String result = helloWorld.sayHello(name);
		System.out.println("EJB注入成功!" + result);
		return result;
	}

}

客户端调用:

package com.manfred.ejb.client;

import java.util.Properties;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import com.manfred.ejb.CallHello;
import com.shuaiyuan.JNDICreate;

public class EJBDIClient {

	public static void main(String[] args) throws NamingException{
		final Properties jndiProperties = new Properties();
		jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
		final Context context = new InitialContext(jndiProperties);
		
		String jndiStr = JNDICreate.lookupStr_remote("", "EJB_07_DIFirstExample", "", "CallHelloBean", CallHello.class.getName(), false);
		System.out.println(jndiStr);
		
		CallHello ch = (CallHello) context.lookup(jndiStr);
		String result = ch.say("Manfred Shuai");
		System.out.println(result);
	}

}

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

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值