EJB3.0学习心得
Enterprise JavaBean
一、EJB3.0的特点
EJB3.0的一个关键目标就是简化开发人员的工作
简化的EJB
EJB3.0不再需要home接口,bean类不需要再实现javax.ejb.EnterpriseBean接口,EJB的bean类可以是一个纯粹的java类(常被称作POJO-plain old java object),它所继承的接口可以是一个简单的商业接口。
注解取代部署描述符
部署描述符被元数据注解所取代,元数据描述符可以用来指定bean的类型、事务、安全性、O-R映射、环境注射(injection)以及资源引用等属性。部署描述符可以override元数据注解。
从属注射(Dependency injection)
简化了lookup API和资源引用的使用,取而代之的是从属注射模式,元数据注解被用来表达从属注射模式。
简化的JNDI lookup方法
EJB的lookup方法被简化了,客户端可以直接调用EJB中的方法,不再需要调用EJB的create方法先生成一个bean的实例。
拦截者(interceptors)
拦截者是一个拦截商业方法请求(invocation)的方法,它可以定义在无状态的session bean,有状态的session bean或者消息驱动bean中,在同一个类中也可以用拦截者类代替拦截者方法。
增强的查询语言
EJB3.0极大的增强了实体bean的查询能力,增加了很多操作,比如块更新、块删除、JOIN操作、GROUP BY HAVING,projection以及子查询等,EJB-QL得到了许多增强,EJB-QL也支持动态查询。
二、采用EJB架构的目标
减轻直接操作底层数据库的工作量
为企业级开发引入了面向对象/面向服务的开发架构
数据对象生命周期的自动管理
分布式能力
集成/声明式的安全/事务管理
三、什么时候不使用?
小的项目中尽量不用;
没有多台服务器并行操作的情况下也不要用,平白增加网络开销;
负载压力不大的情况下也不要用,反而会比一般的java bean还慢;
没有有j2ee经验的团队参与项目的情况下也不要用,会把项目搞得一团糟,使用j2ee需要一到两年的磨合,这也是j2ee的缺陷。
四、什么时候使用?
如果业务逻辑很many(多)时;
如果安全性要求很high(高)时;
如果与数据库交流特frequency(频繁)时;
如果不想很quickly(快)拿下项目时;
如果客户想花more money时
五、EJB运行机制
六、搭建EJB3.0开发环境—工具
工欲善其事,必先利其器
工具
开发工具:
Eclipse3.2+MyEclipse5.0
或NetBean5.5
EJB容器:jboss-4.0.4.GA
JDK版本:JDK1.5以上(JDK1.4不支持)
七、搭建EJB3.0开发环境—配置
将JBOSS与MyEclipse集成
Window->Preferences->MyEclipse->Application Servers->JBoss4
选中Enable
Jboss home directory:选择JBOSS的安装目录
Server Name : all
八、需要的包
创建EJB需要的包:
jboss-ejb3x.jar
jboss-annotations-ejb3.jar
访问EJB需要的包:
jbossall-client.jar
jboss-aop-jdk50.jar
jboss-aspect-library-jdk50.jar
jboss-ejb3.jar
九、体验一个EJB—无状态会话Bean
1、暴露业务方法的接口
表面上只是一个简单的接口而已,功能等同于EJB2.0中的远程接口.
代码:
package com.impl;
public interface HelloIm {
public String haha(String msg);
}
2、实现业务的EJB核心类
表面上只是一个POJO,的确,除去元注释不谈,看起来就像是一个包含业务逻辑的javabean.
代码:
package com.shixian;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import com.impl.HelloIm;
@Remote({HelloIm.class})
@Stateless
public class Helloshixian implements HelloIm {
public String haha(String msg) {
// TODO Auto-generated method stub
return msg+" "+"说:你好,哈哈哈";
}
3、实现业务的EJB核心类—解释
@Stateless
定义一个无状态会话BEAN
@Remote({HelloIm.class})
定义一个远程接口,参数是指实现的接口名称
4、将EJB打包
创建好EJB后,必须打包,生成*.jar文件.
打包方法:
File->Export->Java->Jar file
选择要打包的文件,实际上就是前面创建的接口和类.
选择输出路径
一路”next”,完成
5、在EJB容器中发布EJB
所谓的发布就是将EJB打包后复制到指定目录下,EJB容器在启动时会自动部署.JBOSS4.0支持热部署.
将jar文件复制到下面的目录中:
{Jboss安装目录}/server/all/deploy
6、查看EJB的JNDI名称
如果没有为EJB明确指定用于定位EJB的JNDI名称,Jboss会自动生成一个.
查看JNDI名称的方法:
启动Jboss管理页:
http://localhost:8080/jmx-console
jboss -> service=JNDIView -> List of MBean operations -> Global JNDI Namespace
缺省的JNDI名称组成:
远程接口 : EJB类名/remote
本地接口 : EJB类名/local
7、访问EJB—测试EJB
可以在任何客户端访问EJB,但需要相关包的支持(前面已有说明)
如,通过Application访问EJB
//调用远程方法
Properties props = new Properties();
props.setProperty("java.naming.factory.initial",
"org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.provider.url", "localhost:1099");
props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming");
Context ctx = new InitialContext(props);
HelloIm hw = (HelloIm) ctx.lookup("HelloWorldBean/remote");
System.out.println(hw.haha("李赞红"));
说明
Context ctx = new InitialContext(props);用于设置访问JNDI的上下文环境
ctx.lookup(“HelloWorldBean/remote”);根据JNDI的名称访问EJB,返回接口引用,该接口引用其实就是一个存根(stub),通过该接口引用调用EJB中的业务方法
O(∩_∩)O哈哈~,以上,望指正。谢谢!!!