Enterprise Java Bean是一个用于分布式业务应用的标准服务端组价模型。采用Enterprise JavaBeans架构编写的应用是可伸的、事务性的、多用户安全的。可以一次编写这些应用,然后部署在任何支持Enterprise JavaBeans规范的服务器平台,如jboss、webLogic等。
为什么用EJB
最主要的原因是分布式,分布式对象之间互相协作,完成特定的业务功能。分布式对象之间应实现位置透明,客户端访问时不需要指定分布式对象的位置即可访问。分布式对象之间同样需要支持事务,应用程序也需要支持不同的客户端。
EJB支持分布式,分布式对象之间通过JNDI服务来通信,不需要指定彼此的位置。同样EJB的分布式对象支持事务,也支持不同的客户端。
Enterprise Java Bean
EJB定义了三种类型的Bean,分别为:
Session Bean:又称会话Bean,主要实现业务逻辑,又分为有状态Bean(Stateful Bean)和无状态Bean(Stateless Bean)。当客户端发出EJB调用请求时,容器会选择一个Session Bean来为客户端服务。会话Bean也可以直接访问数据库,但通常是通过实体Bean来实现数据库访问。
有状态Bean和无状态Bean不是说Bean类有无状态,而是指EJB容器是否对Bean的状态进行管理。有状态Bean是EJB会对Bean的状态进行管理,即为同一个客户端在多次请求之间保持状态信息,从客户端的角度来看,这个SessionBean是它独有的。无状态Bean是EJB容器不管理Bean的状态,通常EJB会使用实例池的方式来实现无状态的Session Bean。
@Stateless
// @Stateful
@Remote
// @Local
public class HelloWorldBean implements HelloWorld {
@Override
public String sayHi(String name) {
return "Hello," + name;
}
}
Entity Bean:实体Bean,是普通的Java对象,负责跟数据库表进行对象与关系映射,通常用@Entity来标注。
@Entity
public class UserBean implements Serializable {
private String name;
private Boolean sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Boolean getSex() {
return sex;
}
public void setSex(Boolean sex) {
this.sex = sex;
}
}
MessageDriven Bean:消息驱动Bean,主要用来专门处理基于消息请求的组件。它能够收发异步JMS消息,并能够轻易地与其他EJB交互。它特别适用于当一个业务执行时间很长,而执行结果无需实时向用户反馈的场合。
EJB客户端
EJB支持多种客户端,可以是Web组件,也可以是应用客户端,或者是其他的企业Bean。无论哪一种客户端,都可归为以下两种,分别是远程客户端和本地客户端。
远程客户端:客户端和调用的EJB对象不再同一个JVM进程中,称为远程客户端。
本地客户端:与远程客户端相对,本地客户端和调用的EJB对象必须在同一个JVM进程中。
对应两种客户端,EJB提供了两种调用方式:远程调用和本地调用。能够被远程调用的Session Bean需要用@Remote来标注;能够被本地调用的Session Bean需要用@Local来标注,告诉客户端应使用哪种调用方式。本地调用时,客户端可以直接通过参数和返回值的形式来访问Session Bean;远程调用时,客户端和服务器之间的数据需要序列化之后才能传输。本地客户端可以同时使用远程调用和本地调用的方式,但是远程客户端只能通过远程调用的方式来访问EJB对象。
远程调用和本地调用都可以同时调用多个Session Bean,只需要在@Remote和@Local注解中添加参数即可,即要调用的Bean。
@Stateless(name = "ejb04beanname")
@Remote(value = { Ejb04Interface01.class, Ejb04Interface02.class })
@Local(value = { Ejb04Interface03.class, Ejb04Interface04.class })
public class Ejb04Bean implements Ejb04Interface01, Ejb04Interface02,
Ejb04Interface03, Ejb04Interface04 {
public void m4() {
System.out.println("m4方法被调用了!");
}
public void m3() {
System.out.println("m3方法被调用了!");
}
public void m2() {
System.out.println("m2方法被调用了!");
}
public void m1() {
System.out.println("m1方法被调用了!");
}
}
JNDI
JNDI是标准Java API,它为各种现有的命名和目录服务提供了通用接口:DNS、LDAP、活动目录(Active Directory)、RMI注册器、COS注册器、NIS及文件系统。结构上JNDI由两部分组成:客户API和服务提供商接口(ServiceProvider Intergace,SPI),应用程序通过客户API访问命名和目录服务;服务提供商接口用于供厂商创建命名和目录服务的JNDI实现。
javax.naming的jar包中提供了Context接口,里面包括两个方法,分别是void bind(String name,Object object)和Object lookup(String name)。
bind方法是将一个名字和一个对象来进行绑定,JNDI服务就可以通过寻找这个名字来找到这个对象。
lookup方法就是通过对象绑定的名字来寻找对象。如果该对象没有绑定名字,那么JNDI就会通过服务器为对象生成的默认名字来寻找。
刚开始学习,认识浅薄,如果有什么不对的地方,希望路过的大牛不吝赐教。