您的位置:首页 > 其它

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

2017-06-25 10:55 357 查看
我们在客户端调用服务端对象的时候,通常需要通过服务器的 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");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: