传智播客--EJB

来源:互联网 发布:第一次啪啪你多大知乎 编辑:程序博客网 时间:2024/04/28 10:26

我们开始学习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