我们开始学习EJB喽.一提到EJB大家可能就会想到,零配置.在EJB2的时候,配置很繁琐.在EJB3时,使用了POJO加Annotation.配 置和使用非常方便.大大提高了我们在开发中的速度.今天我们就来了解一下EJB3.
EJB类型:
Session bean
用于特定业务逻辑 由客户端调用,Session名称意味着在整个工作单元期间都可用,在服务器停止后销毁它可为任何应用逻辑功能进行建模.
Session bean有这样两种状态:Stateful, 无需手动编码,在客户端调用时可自动保存bean状态信息.Stateless, 可通过java rmi进行远程/本地调用,还可暴露成ws
Message-driven bean
同Session Bean相似,也用来处理业务逻辑,不同之处在于客户端从不会直接调用消息驱动Bean.他是由发送到服务器的消息触发的,可用于在系统组件间进行异步消 息的发送. 典型的消息服务器有:IBM WebSphere MQ, SonicMQ, Oracle Advanced Queueing,and TIBCO
Entity和JPA
持久化是自动将java对象中的数据存储到DB中的能力,EJB3中持久化由JPA管理.JPA使用 ORM技术自动持久化Java对象.
EJB3中,持久化供应商本质上就是支持JPA规范的ORM框架.
每种类型的bean用于特 定目的并可使用EJB服务的一个子集.Bean类型的真正目的是防止服务的交叉装配导致的超载.Session Bean和消息驱动Bean用户构建业务
逻 辑,他们驻留在容器中,由容器来进行管理.实体Bean用于对Model进行建模.持久化供应商是可插拔的.
我们前两天学习的JPA同 EJB3容器是完全分离的.业务逻辑的处理是由两个组件完成:session bean和消息驱动bean.这两个组件都是容器负责管理,持久化对象被称为实体,他由持久化供应商通过实体管理器接口进行管理.
EntityManager
实 体不会持久化自身,需要实体管理器来完成持久化工作,EM会读取映射的元数据信息来执行持久化操作.
EJB3,要运行在EJB容器中,大 多的应用服务器都是支持的.如:JBOSS,WEBLOGIC.但这里要注意,我们前一阵一直使用的Tomcat是不支持的,不能在这里运行EBJ.因为 tomcat只是web容器,没有EJB容器.EJB的组件必须要部署到EJB容器中上才能使用.
EJB部署/运行:
①EJB 需要打成jar包部署到AS服务器上运行.Jar 可通过IDE的向导完成打包工作.
② 安装JBoss AS(不要含有中文和空格). 配置环境变量(JBOSS_HOME).在Eclipse下配置JBoss服务器以及启动、停止. JBoss AS服务器默认端口8080,端口配置在
${jboss_home}/server/default/deploy/jboss-web.deplo-yer/server.xml
这 个和我们前面接触到的Tomcat中的web应用程序的部署是不一样的,这个是热部署:不需要重启服务器就可部署(观察控制台内容).通过jmx查看部署 结果.
JNDI:java naming directory interface
SLSB:
客户端并不关心SLSB的内部状态,SLSB 没有必要维护在两次调用中维护实例变量的值.
SFSB:
确保客户端设置bean的内部状态以及即使任意次方法调用数量还是保持不变.容器 保证这一目的要做两件幕后的事情.
首先,容器要保证客户端可以到达该bean.
其次,容器在你不需要手写代码的情况下维护bean的实例 变量.
EJB类编 程规则
至少有一个业务接口
必须是具体类.不能是final或抽象的.
必须有空构造
可以是其它 sessionbean或pojo的子类
@Stateless
public CustomerManagerBean extends BaseManagerBean
implements CustomerManager {
...
}
生命周期回调方法可以定义在bean类中或超类中.注解继承 需要受到限制,超类中@Stateless or @Stateful注解在部署时将要被忽略.但定义的任何回调方法和资源注入都要被继承.业务方法名不能以ejb开头,可能会干扰ejb底层处理.必须定 义所有的方法为 public的,但不能是final或static的.在远程业务接口中的定义的参数和返回值类型必须实现java串行化接口.
会 话状态和Session bean类型
如果bean要维护会话状态,记住上次交流的结果,这是有状态的会话bean.这意味着bean会从方法调 用中存储数据到实例变量,并使用缓存的数据来处理下一次方法调用.
SLSB不维护任何状态,SFSB趋向于对多个步骤的工作流进行建模,SLSB 则趋向与对常规目的进行建模. SFSB典型案例就是购物车.
Bean的生命周期回调
session bean有生命周期,意味着会有一系列状态的转变.客户端和bean都不负责bean实例何时创建,何时销毁,何时进行优化.这些行为都由容器进行管理.
bean 初始化时,会发生如下过程:
1.容器调用newInstance方法.
2.如果bean使用DI,所有依赖的资源、bean和环境组件都要注入进来.
配置数据源在JBossAS中:
1.xml文件名:{文件名}-ds.xml
2.放到${jboss_home}/server/${your server}/ deploy/下即可.
注:各数据库的参考文档在${jboss_home}/docs/jca/下. 数据源配置文件部署完之后,必须重启JBoss服务器. 启动后,在浏览器中可查看到数据源的JNDI名称.
客户端调用ejb有三种方式:
1. 同一jvm的本地接口调用
2. 通过rmi的远程接口调用
3.SLSB可做为web service调用
SLSB生命周期回调方法
1. 创建bean实例
2.DI资源(数据源)
3.放入到池中
4.从池中取出空闲的bean供客户端调用.
5.执行请求业务
6. 业务完成后,放置bean到就绪的池中.
7.需要的话,销毁bean.
SLSB通过少量的实例来处理实际的并发的访问.理论上可以有多个 @postContruct和@preDestroy方法.但很少这样做.生命周期回调方法不能有参数,而且不能抛出受检查的异常(运行时异常的子类). 这些方法主要用于在特定时刻定位或释放资源.
SFSB的性能考虑
1.高效使用SFSB
SFSB无疑提供了健壮的业务逻辑处理功能, 大多数EJB容器都提供了强大的集群功能,即使一个服务器崩溃后,仍可以有其它服务器来维护客户端状态,不会中断业务处理,要实现这一功能必须要维护会话 的状态,即SFSB.
2.正确选择session数据
不要在session当中存放大量数据,应该只存放重要的关键数据,比如我们只缓存 一个id值在session中.
3.钝化/删除bean