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;
public interface CallHello {
public String say(String name);
}
客户端调用:
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");
· 客户端与服务端必须有一致的基于字符串的名字。 它没有在编译时得到认证或在部署时得到检查。
· 从 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");
相关文章推荐
- Spring学习笔记(10)-----------方法注入
- EJB 学习笔记之 -会话Bean
- Java学习笔记38:通过Spring Bean 注入static变量,来设计一套适合测试,开发,生产环境的配置项
- spring学习笔记 -- day03 IOC中的bean标签、DI依赖注入
- (学习笔记)spring入门之Bean的依赖注入
- Spring学习笔记(10)——方法注入
- spring in action 学习笔记(六)通过setter注入bean属性
- EJB学习笔记-2-Session Bean stateless/remote
- 微软企业库5.0学习笔记(10)ASP.NET模块依赖注入
- [原创]java WEB学习笔记98:Spring学习---Spring Bean配置及相关细节:如何在配置bean,Spring容器(BeanFactory,ApplicationContext),如何获取bean,属性赋值(属性注入,构造器注入),配置bean细节(字面值,包含特殊字符,引用bean,null值,集合属性list map propert),util 和p 命名空间
- Spring学习笔记(3)——Bean的注入方式
- spring in action 学习笔记(七)注入内部bean
- EJB 学习笔记之 -实体Bean
- 【EJB学习笔记】——实体Bean
- 微软企业库5.0学习笔记(10)ASP.NET模块依赖注入
- Spring学习笔记 创建自动扫描并注入的bean
- Spring4学习笔记二:Bean配置与注入相关
- Mini 容器学习笔记10——方法注入
- Spring学习-10:Bean的集合属性的注入
- Spring学习笔记--注入Bean属性