一、普通的javaBean:
1.对象生命周期的管理
2.事务的管理
3.安全性的管理
4.远程方法的调用
二、为什么要使用EJB?
1.使用EJB可以比较简单地开发分布式系统
2.开发EJB组件可以通过声明的方式使用服务器提供的一些企业级的服务,
如事务管理可以全部交给服务器管理
3.使用EJB开发的业务逻辑对象和持久层的对象可以全部交给EJB容器管理
servlet类----->在web.xml中进行描述------>.war------>web容器------>web容器管理servlet的生命周期(包括创建和销毁)
ejb类----->在ejb-jar.xml中进行描述------>.jar------>ejb容器------>ejb容器管理ejb的生命周期(包括创建和销毁)
三、什么是EJB?
1.ejb是j2ee的一个标准,适合开发大型的分布式系统,是一个分布式的组件架构。
2.ejb是一个可扩展的、可靠的、安全的组件架构
3.使用ejb开发的组件可以被部署到任何j2ee服务器上
四、ejb和javaBean的比较
1.相同点
1)都可以提供getter和setter方法
2)都是可重用的组件
3)都可以有属性和方法
4)都可以进行组装构建一个java系统
2.不同点
1)javaBean要比ejb要小(ejb比javaBean复杂)
2)javaBean是开发组件不是部署组件,而ejb是部署组件
五、ejb的角色
1.封装业务逻辑
2.完成数据持久(访问数据库)
3.访问其他的已有系统(JCA)
六、ejb的种类
1.session bean(会话bean):封装业务逻辑
2.entity bean(实体bean):访问数据库
3.message bean(消息驱动bean):处理消息
七、RMI:java中提供的一种于远程调用机制
RMI/IIOP:是RMI的一个扩展版本,适合用于intenet上
注意:在调用ejb的时候不会涉及到底层的远程方法的调用过程
八、Proxy pattern(代理模式):两个对象实现共同接口或者继承共同父类,调用其中一个对象的方法等同于调用另外一个对象的方法。stub和ejb对象之间采用的代理模式
九、ejb的组成:可以包含四个接口和一个实现类,以及一个描述文件:ejb-jar.xml
1.javax.ejb.EJBLocalObject
2.javax.ejb.EJBObject
3.javax.ejb.EJBLocalHome
4.javax.ejb.EJBHome
其中四个接口可以分为两组:
1.EJBLocalObject和EJBLocalHome:ejb组件只能通过本地方式访问,指的是ejb客户端和ejb是通过引用来操纵的
2.EJBObject和EJBHome:ejb组件只能通过远程方式访问,指的是通过stub和skeleton来相互调用
jbuilder中一个project可以包含多个ejbmodel,一个model可以包含多个ejb组件
十、ejb的部署描述文件包含两个:
1.标准的部署描述文件:ejb-jar.xml,描述ejb组件的相关信息
2.根容器相关的部署描述文件:weblogic-ejb-jar.xml,描述根ejb容器相关的信息,如ejb组件的jndi的名字
十一、1.the remote interface :===>the EJB Object
public interface Hello extends javax.ejb.EJBObject
作用:1).容器根据这个接口创建EJB Object对象
2).如果bean类中的商业方法需要被以远程的方式调用,那么这些方法必须在这个接口中定义,
并且抛出RemoteException
2. the home interface:===>the Home Object
public interface HelloHome extends javax.ejb.EJBHome
作用:1).容器根据这个接口创建Home对象,这个接口中定义的方法必须要抛出RemoteException
通过远程方式使用。
2).这个接口中定义的create方法创建EJB Object对象
3. the local interface:===>the Local Object
public interface HelloLocal extends javax.ejb.EJBLocalObject
作用:1).容器根据这个接口创建Local Object对象
2).如果bean类中的商业方法需要被以本地方式调用,那么这些方法必须在这个接口中定义
4.the local home interface:===>the Local Home Object
public interface HelloLocalHome extends javax.ejb.EJBLocalHome
作用:1).容器根据这个接口创建Local Home对象,这个接口中定义的方法只能通过本地方式访问。
2).这个接口中定义的create方法创建Local Object对象
5.the enterprise bean class :===>
public class HelloBean implements javax.ejb.SessionBean
作用:提供业务逻辑方法的真正实现
本地调用的步骤:
client:1).创建InitialContext对象
2).查找Local Home 对象,返回Local Home 对象的引用
3).调用Local Home对象的create方法,返回Local Object的引用
4).调用Local Object中声明的商业方法
远程调用的步骤:
client:1).创建InitialContext对象
2).查找Home stub
3).调用Home stub的create方法,返回EJB Object stub对象
4).调用EJB Object stub对象中声明的商业方法
十二、EJB2.x中使用到的模式
1.proxy(代理模式)
home stub 和home object
ejb object stub 和ejb oject
2.factory-method(工厂模式)
home对象采用这个模式,他作为一个工厂,生产的产品是EJBObject
3.delegate (委托模式)
ejb object和bean 对象之间
十三、EJB中的异常
1.应用级别的异常
这种级别的异常能直接抛给ejb客户端,如:javax.ejb.CreateException
2.系统级别的异常
这种级别的异常不能直接抛给EJB客户端,ejb容器将这种异常包装成RemoteException或者它的子类型,然后再抛给客户端
*EJBContext是EJB容器和Enterprise bean对象通讯的对象
十四、EJB中间件
1.隐式的中间件:通过声明的方式去使用的服务,称为隐式中间件,在EJBObejct中调用这些服务。
优缺点:1.业务逻辑方法中只需要关注业务逻辑过程,不需要关注中间件服务的使用,容易维护。
2.所有使用中间件服务的过程都是由容器来决定的,不是很灵活。
2.显式的中间件:通过编码的方式去使用的服务,称为显式中间件;在bean类中调用这些服务。
优缺点:1.使用服务的过程是由开发人员决定的,使用起来比较灵活。
2.在业务逻辑方法中除了有业务逻辑代码之外,还有使用中间件服务的代码,这样维护起来比较困难。
EJBObject==Request Interceptor(EJBObject!=Enterprise bean class)
作用:
1.隐式的分布式事务管理
2.隐式的安全管理
3.隐式的资源管理和组件声明周期管理
4.隐式的持久化
5.隐式的远程访问
6.隐式的组件位置透明
十五、stub和skeleton
1.两者都是在服务器端创建,stub在客户端运行,skeleton在服务器端运行。
2.在EJB中,bean对象是单线程访问的。
优点:不用关心并发访问的问题
缺点:影响性能
3.池的配置:
1)池的出示大小:在部署完毕EJB组件之后,创建bean对象的数量
2)池的最大容量:池中放置bean对象的最大数量
4.当EJB客户端一个会话跨多个方法调用,那么无状态的会话bean是不能保存客户端的状态。
Home/LocalHome 接口 bean类
create() ===> ejbCreate();
create(int val) ===> ejbCreate(int val);
5.无状态会话bean的bean对象是由容器来创建的,有状态的会话bean的bean对象是由Home/LocalHome对象来创建的
LRU:最近最久未使用;
NRU:最长时间未使用。
十六、有状态会话bean和无状态会话bean的比较
1.无状态的会话bean的对象对于所有的客户端都是共享的,而有状态的会话bean只能由一个客户端调用,所以当客户端发起的一个请求跨多个方法调用的时候,无状态会话bean不能维护客户端状态,而有状态bean则可以。
2.在并发请求比较多的时候,为了提高性能,无状态会话bean使用pool,而有状态会话bean为了限制内存当中bean对象的数量,从而提高性能,使用了cache。
3.无状态的会话bean是由容器来决定是否被创建,并且也是由容器来创建的,而有状态的会话bean是由客 户端来决定是否被创建,只要客户端调用home对象的create方法,就会创建一个bean对象。
4.ejbPassivate和ejbActivate对于无状态会话bean是无意义的,对于有状态的会话bean:当bean对象被钝化之前,会调用ejbPassivate(),用于释放一些无法被钝化的资源,如DataSource,当bean对象被重新激活之前,会调用ejbActivate(),用于恢复在ejbPassivate中被释放的资源。
十七、消息驱动bean
1、发送消息的一方,称为消息生产者。
2、接收消息的一方,称为消息的消费者。
3、主题消息(topic)===>发布订阅式
4、队列消息(queue)===>点对点式
5、topic类型的消息有如下两种订阅者:
1)、持久的订阅者:消息的生产者生产一个Topic消息,此时MDB没有运行,如果MDB是一个持久的订阅者,那么下一次MDB运行的时候,可以接收到此消息。
2)、非持久的订阅者:消息的生产者生产一个Topic消息,此时MDB没有运行,如果MDB是一个持久的订阅者,那么下一次MDB运行的时候接收不到此消息。
十八、什么是jms?
1、jms j2ee其中的一个标准,用于访问jms服务,接收和发送消息。
2、JMS编程的步骤:
1)通过jndi查找ConnectionFactory对象
2)通过ConnectionFactory对象创建Connection对象
3)通过Connection对象创建Session对象
4)通过jndi查找Destination对象
5)通过Session对象创建MessageSender或者MessageReceiver对象
6)通过MessageSender对象发送消息或MessageReceiver对象接收消息
十九、什么是MDB
1、MDB是一种特殊的EJB组件,用来接收jms消息,能够消费queue或topic消息
2、Bean类实现了MessageDriverBean接口之外,还实现了MessageListener接口,提供了唯一的商业方法onMessage(),没有返回值。
3、不能抛异常给客户端
4、无状态的
5、可以是持久或者非持久的订阅者。
6、MDB的高级特性:
1)MDB的客户端和MDB不可能运行在同一个事务中。
2)MDB不能使用EJB容器提供的安全服务
3)负载均衡
在集群的环境中,MDB能很好的完成负载均衡。
4)重复消息
在集群的环境中,topic类型的消息很有可能被重复消费
解决办法就是使用queue类型的消息替代topic类型的消息
5)消息的无序
生产者生产的消息不能保证消息是先进先出
6)ejbRemove()方法有可能被调用
当发生系统级别的异常或系统崩溃的时候
7)毒消息:当MDB在处理消息的时候出现食物回滚,从而导致消息没有被正常消费,JMS Server
会将同一个消息重复进行发送,出现一个死循环。
a、在onMessage中不要抛出系统级别的异常
b、使用bean管理事务代替容器管理事务
c、有些服务器本身提供了处理毒消息的功能,比如同一个消息被重发若干次就自动删除