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

来源:互联网 发布:hadoop能用python吗 编辑:程序博客网 时间:2024/05/23 11:49
我们在客户端调用服务端对象的时候,通常需要通过服务器的 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");  


原创粉丝点击