您的位置:首页 > 其它

EJB--简介

2015-05-04 16:45 246 查看
EJB是sun的JavaEE服务器端组件模型,设计目标与核心应用是部署分布式应用程序。凭借java跨平台的优势,用EJB技术部署的分布式系统可以不限于特定的平台。EJB
(Enterprise JavaBean)是J2EE的一部分,定义了一个用于开发基于组件的企业多重应用程序的标准。其特点包括网络服务支持和核心开发工具(SDK)。
在J2EE里,Enterprise Java Beans(EJB)称为Java
企业Bean,是Java的核心代码,分别是会话Bean(Session
Bean),实体Bean(Entity Bean)和消息驱动Bean(MessageDriven
Bean)。

先来简单介绍下Session Bean
和MessageDriven Bean
会话 Bean( Session
bean)在业务逻辑的实现中使用的频率很高,它在 EJB
技术中成了很重要的一部分。 Session bean
有一下几种特征:
• Stateless:
这种 Session bean
在方法调用中不包含会话状态,任何实例都可以被任意的客户端调用。
• Stateful:
这种 Session bean
包含会话状态,一个实例只能被一个客户端持有。
• Singleton:
单例 session bean,只存在一个实例,并被所有客户端共享,并支持同步调用。
消息驱动Bean(Message-driven bean(MDB))
通过使用 JMS
接收异步消息来与外部其他系统集成。这个组件模型主要通过消息中间件(MOM)用来集成系统,MDB
通常带业务逻辑给会话 Bean

现在开发一个EJB非常的简单,一个简单的 java 类和一个标注就能构成一个EJB如:

@Stateless
publicclass EJBTest {

public Book
methodOne(Long id) {
}

public Book
methodTwo(String param) {
}
}


EJB 是一个服务器端的组件,一个简单的 java 类和一个标注就能构成一个EJB,那EJB与普通java
类的区别就是什么呢?那就是EJB必须要运行在 EJB容器中,EJB容器提供EJB所需要的运行环境,EJB容器能够提供如下的一些功能.
远程客户端通讯( Remote client communication) :

不需要编写额外的代码,一个EJB客户例如:另一个EJB、一个用户接口,一个进程等等)端就可以通过标准的协议来远程调用方法。

依赖注入( Dependency injection):
容器可以注入各种资源到 EJB 中(例如:JMS destinations
andfactories, datasources, 其他 EJB, 环境变量等等)

状态管理( State management) :
对于有状态会话 Bean,容器管理着它们的状态。你可以为你的客户端保持状态.

池( Pooling) :
对于无状态会话 Bean 和消息驱动 Bean,容器池化一些实例,这些实例被多个客户端共享。每次调用完毕,实例被放回到池中,而不是被销毁。

组件生命周期( Component life cycle) :

容器可靠地管理着组件的生命周期

消息( Messaging) :

容器允许 MDB 侦听消息源并消费消息,并不使用太多的 JMS 探测

事务管理( Transaction management) :
通过声明式事务管理, EJB 可以使用标注来告诉容器它所需要的事务级别,容器管理着事务的提交与回滚。

安全( Security) :

EJB 可以指定类或者方法级别的访问控制,要求强制验证用户或者角色

并发同步( Concurrency support) :
除了单例,一些并发申明是需要的,其他所有类型的 EJB是默认线程安全的。你可以开发性能好的应用而不必担心线程问题。
拦截器( Interceptors) :

切入点( Cross-cutting concerns)可以放到拦截器中,容器会自动调用它。

异步方法调用( Asynchronous method invocation) :
在 EJB 中,可以不使用消息而实现异步调用

有关会话Bean

会话Bean存在三种子类型:Stateless,Stateful

Singleton,用于创建不同类型的会话。

Stateless
无状态会话Bean适用于只需单个请求会话即可完成的业务过程(
事务处理必须在一个方法中结束 )。这样,EJB组件不需要维护方法调用间的状态变更信息。为了实现有效的Bean实例处理,EJB容器经常会使用实例池技术。由于无状态会话Bean不含会话状态,因此同一无状态会话Bean类的所有实例对于客户而言都是等效的。而且无状态会话Bean不保留历史会话信息,所以它对于调用其本身的客户也并不关注。因此,任何无状态会话Bean都能够服务任何客户请求。因为这些无状态会话Bean都是一样的。

Stateful
有状态会话Bean适用于需要若干请求形成才可完成的业务过程。这样,EJB组件就需要维护方法调用间的状态变更信息. 在有状态会话Bean中各个Bean实例中存储的状态信息仅是单个客户的。如果和无状态会话Bean的处理一样,只是简单的将实例全部放置实例池中,当大量的并发客户操作时,内存中运行的有状态会话Bean实例就会过多而失去控制。

Singleton
Singleton 是 ejb 中会话 bean 的一种,容器会确保它在每个应用中只会实例化一次。它实现了单例模式。Singleton 在所有客户端之间共享状态。Singleton是不能感知群集的。集群是一组容器紧密地合作(共享相同的资源,EJB
等等)。因此,在某些情况下,需要在好几台机器上部署分布式容器集群,每个容器将有它自己的 Singleton 实例。

有状态的Bean带来了支持会话状态的好处但同时付出了性能的代价。无状态bean具有更好的性能,但却又不具备与客户端的亲合力。struts2中将Action和ActionForm合二为一,就有了状态,因为每次请求都创建一个新的实例,所以没有线程安全问题,而struts1就不能这么做了,struts1的Action采用的是单例模式,仅有Action的一个实例来处理所有的请求,所以使用struts1的时候要特别小心,要保证Action的资源是线程安全最好采用无状态。


有关消息驱动Bean

消息驱动bean是一种通过消息方式为外界提供服务的组件。MDB和它的使用者之间是一种松散耦合的关系.由于MDB组件在使用的过程中,其客户并不拥有MDB组件的远程引用,而是直接将消息发送到特定的队列中,因而用户的调用并不强求MDB组件的运行,在mdb组件没有运行的情况下,客户发送的请求数据会临时保存到消息队列中,当MDB组件加载后,消息队列中的调用消息才能得到处理。javaee规范并没有规定MDB将处理结果返回给消息调用者的方式,但是通常情况下MDB组件是将处理完的结果以消息方式发送到特定结果队列中,如果客户程序没有运行,结果会临时存放在消息队列中,直到客户程序启动,结果队列中的消息才能得到处理。

MDB可以和两种消息队列关联,如果和Topic型的队列关联,则客户发送到队列中的消息,会依次广播给所有的MDB组件,所有的MDB组件会得到相同的消息。

MDB组件和具体的业务逻辑无关,从特定的消息队列中获得消息,消息内容要在MDB的onMessage方法中处理,具体的而业务逻辑通常委托给其他的ejb组件。


有关实体Bean
实体Bean的主要作用就是维护数据的持久性
小结:

实体Bean的主要作用就像开始时说的一样是维护数据的持久性;会话Bean可以提供实现业务逻辑的方法;消息驱动Bean是基于J***A消息技术的EJB对象,可以与JMS程序相配合,实现对消息列队的操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: