快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门新匍京1_龟发之家论坛



本文从实战角度对照EJB2和EJB3的异同,经由过程深入剖析揭示EJB3.0的本相,EJB3.0真是带来简化?照样一种表象上的简化?EJB3.0真的变得轻量了,照样披着羊皮的狼?

EJB编程模型的简化

首先,EJB3简化的一个主要体现是:在EJB3中,一个EJB不再象EJB2中必要两个接口一个Bean实现类,虽然我们曩昔应用JBuilder这样可视化开拓对象自动天生了EJB2的这三个类,似乎不感觉繁杂,然则当EJB个数增添时,就显得累赘了。

简化后的EJB3的sessionBean寄托annotations元注释来定义SessionBean的类型,也便是说,EJB2中的SessionBean类型区分在EJB3继承承袭,只不过书写代码的要领不合而已,例如下代码应用@Stateless表示一个无状态Bean.

package example;

@Stateless

public class TestSessionBean implements TestSessionLocal{

public void xxxx(){

System.out.println("hello");

}

}

上述Session Bean中没有了EJB2中ejbCreate等多余措施,这样TestSessionBean很象一个通俗JavaBeans了。是不是简单?先别急,我们必要接着看看这个TestSessionBean是若何调用?

在EJB2中,一个EJB工具的调用必要颠末两个步骤:JNDI探求和工厂创建,如下例:

Context ctx = new InitialContext();

TestSessionLocalHome home = (TestSessionLocalHome)ctx.lookup("java:comp/env/ejb/TestSession");

TestSessionLocal bean = home.create();

bean.xxxx();//真正目的 工具应用

着实上述代码着末一句才是我们真正目的,然则为了这个目的,必须颠末前面冗长的代码创建,而在EJB3中,为创建型模式的Ioc模式(或称依附打针)取代了home.create这样简单工厂创建模式,以一种加倍松耦合和简洁的要领办理了工具创建问题,可以让我们精力更集中在工具的应用上了。

下面是annotations+Ioc/DI的EJB3调用代码:

@EJB //留意这里后面是空缺

private TestSessionLocal testbean; //应用接口声明

public void invoke(){

testbean.xxxx(); //直接应用

}

上述EJB3调用代码中,@EJB后面是空缺,这着实应用了TestSessionLocal的缺省JNDI名称,不停到这里,我们不停满意于EJB3的简化,然则假如钻研@EJB语法后,会发明其完备写法如下:

@EJB(

name = “ejb/shopping-cart”,//被调用者Cart实现类的ejb-reference名称

beanName = “cart1”, //被调用者的名称 beanName

beanInterface = ShoppingCart.class, //接口名称

description = “The shopping cart for this application”

)

private Cart myCart;

上述完备@EJB写法适用于同一个接口有多个实现子类时,此中关键是 beanName的定义:beanName是被调用EJB的类名 (不带包名,称为unqualified name ),或者, 假如被调用EJB有 XML descriptor定义, 它便是设置设置设备摆设摆设项ejb-name值(假如你应用过EJB2,就轻易理解这个ejb-name了)。

@EJB还有一个属性mappedNam澳门新匍京1e,这是被调用者的JNDI名称,一样平常不应用,由于这个JNDI名称和详细办事器有关,假如是JBoss4,那么它的缺省形式是:"EAR-FILE-BASE-NAME/BEAN——CLASS-NAME/local" (or remote)。 也便是:被调用者EJB所在EAR包的名称/Bean实现子类(不带包名)/local,假如是remote调用,便是remote. 假如这个EJB被打包在jar包中,那么JNDI名称便是EJB-CLASS-NAME/loc澳门新匍京1al and EJB-CLASS-NAME/remote,当然,作为调换@RemoteBinding 和 @LocalBinding 也可定义JNDI名称。

也便是说:JBoss的EJB3中,假如你不应用XML设置设置设备摆设摆设,直接应用annotations,那么JNDI缺省名称没有一个统一规定名称,有的可以直接是类名;在JBoss中还和EJB打包的形式有关,是动态变更的。假如你以为在EJB3中不会打仗到这个变更的JNDI缺省名称,那你就错了。

JBoss 4 在Servlet中不支持类似EJB调用EJB那样的依附打针 binding-by-injection,由于Web容器和EJB容器是两个不合容器,当然借助别的JBoss Seam则是别的一回事,是以,在Web层调用EJB,就必须经由过程JNDI绑定一个session bean,这时,你就必须应用到那个变更不定的缺省JNDI名称了。

JNDI Naming Context

无论J2EE照样Java EE中,JNDI是一个似乎不起眼,然则极其紧张的观点,不理解JNDI可以说,对J2EE或JavaEE只懂得一半。

JNDI原先是EJB2中对照繁杂的一个观点,不合容器有自己的JNDI名称,由此EJB2引入了第三者EJB-Reference,虽然办理了代码中耦合JNDI名称问题,然则又带来了加倍啰嗦的设置设置设备摆设摆设,这种征象当然被JavaEE5.0继承承袭了下来,问题远非这么简单。

J在Java EE5.0中(包括EJB3和Web情况),当我们必要造访一个JNDI情况下资本时,有两种要领:除了传统EJB2中的JNDI调用要领;还有一种便是:应用依附打针Ioc模式,这个依附打针的表达要领是应用annotations.

是以,在EJB3中,必须好好搞清楚annotations、依附打针和JNDI之间的关系,假如这个问题不弄明白,EJB3就绝非EJB2那么轻易搞定,当然,搞定了的结果很简单,让人感到简化轻量了,真不知道EJB3这种简化是不是有点象“掩耳盗铃”。

可以总结一句:凡是EJB2中应用设置设置设备摆设摆设文件定义的;EJB3一样平常都可以应用 annotations定义(当然EJB3也支持设置设置设备摆设摆设文件定义);凡是EJB2经由过程JNDI探求的资本(调用容器中其他EJB、调用情况变量等Resource资本等),都是可以寄托annotations+依附打针机制完成。

JPA替代实体Bean

。假如说EJB3与EJB2变更最大年夜的部分,便是持久层应用Java Persistence API 替代了EJB2的实体Bean,这样,我们经由过程Evans DDD建模获得的Domain Model类可以直接持久化保存到数据库,不像EJB2中还必要在Model类和实体Bean中进行一次转换。

EJB3引入澳门新匍京1EntityManager进行必要持久实体的查询及其新增改动;EntityManager异常类似JDBCTemp/HibernateTemplate等持久化模板。

JPA和JDO以及Hibernate等O/R mapping框架都是异常相似的。

虽然在JPA中,我们都可以应用Annotation来替代设置设置设备摆设摆设,实现很多以前必要专门设置设置设备摆设摆设文件才能实现功能,不再必然必要 每个办事器不合的cmp映射文件,增强了移植性,然则EJB3照样必要 一个叫persistence.xml设置设置设备摆设摆设文件,在这个设置设置设备摆设摆设中进行数据库JNDI设置设置设备摆设摆设;当然,还有一些和详细办事器有关的设置设置设澳门新匍京1备摆设摆设属性,假如应用JBoss,JBoss的JPA底层应用Hibernate实现,是以在persistence.xml要进行有关Hibernate属性设置设置设备摆设摆设:

java:/澳门新匍京1TestDS

您可能还会对下面的文章感兴趣: