EJB学习笔记_10_依赖注入(beanname注入)
来源:互联网 发布:hadoop能用python吗 编辑:程序博客网 时间:2024/05/23 11:49
我们在客户端调用服务端对象的时候,通常需要通过服务器的 JNDI 来查找session bean或MDB。JNDI 查找是把客户端与实际的服务端实现解藕的关键步骤。 但是, 直接使用一个字符串来进行 JNDI 查找并不优雅。有这样几个原因:
· 客户端与服务端必须有一致的基于字符串的名字。 它没有在编译时得到认证或在部署时得到检查。
· 从 JNDI 返回的服务对象的类型没有在编译时进行检查, 有可能在运行时出现转换(casting)错误。
· 冗长的查找代码,有着自己的 try-catch 代码块,在应用之间是重复的和杂乱的EJB 3.0,对任何 POJO,提供了一个简单的和优雅的方法来解藕服务对象和资源。
远程接口和实现类
客户端调用:
注意:注释也可以被用在JavaBean风格的setter方法上,效果是相同的。还有一点就是JavaBean的的@Stateful或者@Stateless注释的"mappedName"的属性可以改变JavaBean的JNDI名称,例如@Stateful(mappedName="123"),那么通过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
- EJB学习笔记_10_依赖注入(beanname注入)
- EJB学习笔记七(依赖注入)
- EJB学习(五)——依赖注入
- Spring学习笔记(1)---依赖注入
- Spring学习笔记(8)-----------依赖注入
- Spring学习笔记(三)依赖注入
- Angular4学习笔记(四)- 依赖注入
- Spring 学习笔记 ----依赖注入
- [学习笔记]Spring依赖注入
- Spring学习笔记 依赖注入
- 【Spring学习笔记】依赖注入
- EJB系列(四)——Spring依赖注入 && EJB依赖注入
- EJB---->依赖注入(dependency injection)
- Spring学习笔记(二)依赖注入Dependency Injection
- AngularJs学习笔记--Dependency Injection(DI,依赖注入)
- Spring学习笔记(5)----依赖注入的简单实现
- Spring 4 学习笔记-依赖注入(一)
- Spring学习笔记(5)----依赖注入的简单实现
- P1066 2^k进制数 NOIP 2006 提高组 第四题
- android桌面小部件appwidget使用ListView或者StackView如何刷新
- 响应式设计(responsive web design)的视图显示法
- TCP 握手与挥手
- color报错
- EJB学习笔记_10_依赖注入(beanname注入)
- BZOJ 1925: [Sdoi2010]地精部落 dp
- python的pygame涉猎
- zookeeper单机伪集群配置
- [leetcode]128. Longest Consecutive Sequence
- java反射应用
- UVa 11059(枚举)
- windows 7安装CartoCss
- CS231n+assignment1(作业一)