一、EJB基础:
EJB是sun的JavaEE服务器端组件模型,设计目标与核心应用是部署分布式应用程序。凭借java跨平台的优势,用EJB技术部署的分布式系统可以不限于特定的平台。EJB (Enterprise JavaBean)是J2EE(javaEE)的一部分,定义了一个用于开发基于组件的企业多重应用程序的标准。其特点包括网络服务支持和核心开发工具(SDK)。 在J2EE里,Enterprise Java Beans(EJB)称为Java 企业Bean,是Java的核心代码,分别是会话Bean(Session Bean),实体Bean(Entity Bean)和消息驱动Bean(MessageDriven Bean)。 -------------来自百度百科
先看一下EJB的官方解释。
商务软件的核心部分是它的业务逻。业务逻抽象了整个商务过程的流程,并使用计算机语言将它们实现。
J2EE对于这个问题的处理方法是将业务逻从客户端软件中抽取出来,封装在一个组件中。这个组件运行在一个独立的服务器上,客户端软件通过网络调用组件提供的服务以实现业务逻,而客户端软件的功能单纯到只负责发送调用请求和显示处理结果。在J2EE中,这个运行在一个独立的服务器上并封装了业务逻的组件就是EJB(Enterprise Java Bean)组件。
用通俗话说,EJB就是:"把你编写的软件中那些需要执行制定的任务的类,不放到客户端软件上了,而是给他打成包放到一个服务器上了"。
EJB的三种类型:
1.Session Bean用于实现业务逻辑,它可以是有状态的,也可以是无状态的。每当客户端请求时,容器就会选择一个Session Bean来为客户端服务。Session Bean可以直接访问数据库,但更多时候,它会通过Entity Bean实现数据访问。
2.Entity Bean是域模型对象,用于实现O/R映射,负责将数据库中的表记录映射为内存中的Entity对象,事实上,创建一个Entity Bean对象相当于新建一条记录,删除一个Entity Bean会同时从数据库中删除对应记录,修改一个Entity Bean时,容器会自动将Entity Bean的状态和数据库同步。
3.MessageDriven Bean是EJB2.0中引入的新的企业Bean,它基于JMS消息,只能接收客户端发送的JMS消息然后处理。MDB实际上是一个异步的无状态Session Bean,客户端调用MDB后无需等待,立刻返回,MDB将异步处理客户请求。这适合于需要异步处理请求的场合,比如订单处理,这样就能避免客户端长时间的等待一个方法调用直到返回结果。
二、EJB实现原理:
EJB是运行在独立服务器上的组件,客户端是通过网络对EJB对象进行调用的。在Java中,能够实现远程对象调用的技术是RMI,而EJB技术基础正是RMI。通过RMI技术,J2EE将EJB组件创建为远程对象,客户端就可以通过网络调用EJB对象了。
EJB在系统中的位置:
三、使用EJB
EJB运行机制:
服务器端:在EJB组件部署到容器上后,容器会自动生成三个对象,这三个对象是:Home对象、Remote对象或Local对象、Enterprise Bean对象。
客户端调用流程:使用JNDI机制绑定与定位EJB,Context.lookup找回是Home对象,然后在使用Home接口的create方法创建Remote对象;调用Remote接口中的业务方法;使用完EJB应该调用remove方法删除。如下: (1)发现EJB
客户端需要调用ejb的本地接口,所以需要取得本地接口的远程引用,在J2EE环境中,可以通过JNDI访问这类命名服务,也就是可以使用JNDI来获取EJB本地接口的引用,这是因为EJB容器使用部署中指定的JNDI名字注册了本地接口。(部属EJB时可以设置JNDI名字,客户端就通过JNDI名字来查找到这个EJB)
Try
{
InitialContext ic = new InitialContext();
Object lookup = ic.lookup(“java:comp/env/ejb/Agency”);
AgencyHome home=(AgencyHome)PortableRemoteObject.narrow(lookup,AgencyHome.class);
}
(2)使用
Try
{
Agency agency = home.create();
//向新创建的EJB返回一个 远程引用。
System.out.println(agency.getAgencyName());
}
(3) 删除
Agency =null
当本地RMI允许检测到远程对象不再有任何本地引用时,将为这个对象触发远程垃圾箱,意味着远程引用超时了,这会导致在服务器端再次引用对象,然后变销毁bean
总结:EJB实现原理,就是把原来放到客户端实现的代码放到服务器端,并依靠RMI进行通信。