实体Bean
消息驱动Bean(MDB):
会话Bean
用于实现业务逻辑,它分为有状态bean 和无状态bean。每当客户端发出EJB 调用请求时,容器就会选择一个Session Bean 来为客户端服务。会话Bean 可以直接访问数据库,但更多时候,它是通过实体Bean 实现数据访问。
有状态bean和无状态bean
有状态bean 可以维护会话状态,无状态bean 不维护会话状态。要维护会话状态,意味着EJB 容器要为每个用户创建一个bean实例,并通过该实例保存着与用户的会话状态。不维护会话状态,意味着一个bean 实例不需要保存与某个用户的会话状态,这时一个bean 实例可以为多个用户服务。
有状态会话Bean和无状态会话Bean的区别:
远程(remote)和本地(local)接口
远程接口(remote interface):定义了session bean 的业务方法,这些方法可以被来自EJB 容器之外的应用访问到。
本地接口(local interface):同样定义了session bean 的业务方法,这些方法可以被同处于EJB 容器内的其它应用使用。因为local 接口允许bean 之间直接通过内存交互,没有分布式对象协议的开销,从而改善了性能。
要开发一个Session Bean,我们需要定义接口和Bean class。其中接口分为远程(remote)和本地(local)接口。在EJB3.0中,不要求你同时实现remote 和local 接口,但实现两者是比较好的做法。使用@Remote 注释指明实现的接口是远程接口,后者使用@Local 注释指明实现的接口是本地接口。当@Local 和@Remote 注释都不存在时,会话Bean 实现的接口默认为Local 接口。如果在本机调用EJB(确保客户端与EJB 容器运行在同一个JVM),采用Local 接口访问EJB 优于Remote 接口,因为Remote接口访问EJB 需要经过远程方法调用(RPCs)环节,而Local 接口访问EJB 直接从JVM 中返回EJB 的引用。
JNDI(The Java Naming and Directory Interface,Java 命名和目录接口)
是一组在Java 应用中访问命名和目录服务的API。为开发人员提供了查找和访问各种命名和目录服务的通用、统一的方式。借助于JNDI 提供的接口,能够通过名字定位用户、机器、网络、对象服务等。
它为各种现有的命名和目录服务提供了通用接口:DNS、LDAP、活动目录(Active Directory)、RMI 注册器、COS 注册器、NIS 及文件系统。在结构上,JNDI 由两部分组成:客户API 和服务提供商接口(Service ProviderIntergace,SPI),应用程序通过客户API 访问命名和目录服务;服务提供商接口用于供厂商创建命名和目录服务的JNDI实现。JNDI 的结构图:
对于EJB 开发者来说,我们只需要知道使用客户API 如何访问命名和目录服务即可,而不需要知道JNDI SPI 的使用,因为我们不需要使用JNDI SPI 开发JNDI 实现产品,这就好比通过JDBC 访问数据库,我们只需要知道使用JDBC API 如何访问数据库,而不需要知道数据库的JDBC 驱动如何实现。使用客户API 访问EJB3.0,我们需要编写的JNDI 代码不过几句,所以大家不要被吓倒了。
命名服务
用于将名称和对象联系起来,使得我们可以用名称访问对象。例如,当你在web 浏览器输入URL:http://www.foshanshop.net 时,DNS(Domain Name System,域名系统)将这个域名转换成IP 地址。
目录服务是命名服务的自然扩展,在这种服务里,对象不但有名称,还有属性。与命名服务的关键差别是:目录服务中对象可以有属性(例如,用户有email 地址),而命名服务中对象没有属性。
InitialContext = new InitialContext(props);
HelloWorld helloworld = (HelloWorld) ctx.lookup("HelloWorldBean/remote");