`
buzhucele
  • 浏览: 335289 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

EJB3.0与EJB2.O区别

阅读更多
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还有一个属性mappedName,这是被调用者的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/local 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引入EntityManager进行需要持久实体的查询及其新增修改;EntityManager非常类似JDBCTemp/HibernateTemplate等持久化模板。

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

  虽然在JPA中,我们都可以使用Annotation来替代配置,实现很多过去需要专门配置文件才能实现功能,不再一定需要每个服务器不同的cmp映射文件,增强了移植性,但是EJB3还是需要一个叫persistence.xml配置文件,在这个配置中进行数据库JNDI配置;当然,还有一些和具体服务器有关的配置属性,如果使用JBoss, JBoss的JPA底层使用Hibernate实现,因此在persistence.xml要进行有关Hibernate属性配置:
<persistence>

  <persistence-unit name="Ejb3Tutorial">

    <jta-data-source>java:/TestDS</jta-data-source>

    <properties>

      <property name="hibernate.hbm2ddl.auto" value="create-drop"/>

    </properties>

  </persistence-unit>

</persistence>



拦截器概念

  EJB3.0引入了类似AOP中的拦截器概念(注意,AOP不只等于拦截器,所以不能认为EJB3就是完全AOP了),JBoss使用JBossAOP来实现拦截器功能,自己定义的拦截器方法可以拦截任何一个业务方法或生命周期事件回调;拦截方法可以在bean中定义或专门的拦截器类。
@Stateless

@Interceptors( { NullChecker.class, ArgumentsChecker.class })

public class StatelessSessionBean implements StatelessSession {

  // This business method is called after

  // the above two interceptor's @AroundInvoke

  // methods are invoked. Hence it is guaranteed

  // that the argument to this method is not null

  // and it starts with a letter

  public String initUpperCase(String val) {

    String first = val.substring(0, 1);

    return first.toUpperCase() + val.substring(1);

  }

}



  NullChecker和ArgumentsChecker是StatelessSessionBean两个拦截器,在拦截器NullChecker中,必须指定的拦截方法为@AroundInvoke。
public class NullChecker {

  @AroundInvoke

  public Object checkIfNull(InvocationContext ctx)

        throws Exception {

      Method method = ctx.getMethod();

      if (method.getName().equals("initUpperCase")) {

        String param = (String) (ctx.getParameters()[0]);

      }

       .........

      }

       // Proceed to the next interceptor

      return ctx.proceed();

  }

}



总结

  总之,从上面EJB2和EJB3的总结上看,EJB3.0在EJB2基础上,引入了更多概念,最大变化就是Annotation替代了配置文件,对于一些配置文件厌恶者来说,是一个好事;但是在实战中,在一些依赖注射不能照顾到地方,我们还必须和更加复杂的JNDI名称打交道,这恐怕是EJB3的一个不是很完美的地方。

  关于EJB3中可测试性的优点被很多人津津乐道,将EJB脱离容器测试,虽然可以进行微观的单元测试,但是脱离容器就是脱离特定完整的业务场景,所以,基于容器的(也就是基于完整的业务场景)单点跟踪调试才是最重要的,这些必须依赖开发工具的发展,目前已经在Eclipse3.2以后版本+WPT(或JBossIDE/Lomboz)中实现,这个功能适合大部分J2EE/JavaEE程序。

  所以,个人对脱离容器的测试要求并不以为然,而这个曾经是Martin Fowler定义POJO的主要内容,因为在过去容器概念刚刚出现时,很多人都有容器恐惧症,以为容器都是不透明的,我们的业务对象放入进去,就失去了控制,这些都是落后设计观念导致,其实,Java语言本身提供的可跟踪性和介入性是非常强大,目前性能跟踪工具Profiler可以在容器运行时,跟踪到容 器中某个具体类占据CPU多少,占用多少内存资源,那么一个单点调试岂是一个个所谓容器可以阻挡的?容器是Java语言的特点,ClassLoader决定了Java就是一个容器性的语言,关键这个容器是必须透明的。
分享到:
评论

相关推荐

    2022年JavaBean(EJB) 3.0 全新体验Java教程.docx

    EJB3.0的发布旨在解决EJB2.x版本中存在的复杂性问题,提升开发效率和生产力。本教程将聚焦于EJB3.0的改进,包括元数据支持、EJBQL的更新、实体Bean的简化模型以及运行时环境的变化。 1. 元数据支持(Java5的程序...

    EJB3.0详解

    2. **实体Bean(Entity Bean)**:实体Bean用于持久化数据,即它们与数据库中的表进行对象关系映射(O/R Mapping)。实体Bean不仅存储数据,还负责与数据库的交互,实现了数据的CRUD(Create、Read、Update、Delete...

    EJB3.0.PDF

    2. **采用POJO模型**:实体Bean在EJB3.0中转变为简单的Java Bean,即POJO,这不仅降低了对容器的依赖,还允许实体Bean在容器外进行测试与运行,极大地提高了开发效率与灵活性。 3. **O/R Mapping技术的全面采用**:...

    ejb3.0笔记和示例代码对应.doc

    ### EJB 3.0 的核心概念与应用 #### 一、EJB 3.0 概览 Enterprise JavaBeans (EJB) 是一个用于构建分布式业务应用的标准服务端组件模型,尤其在Java企业级应用中占据着核心地位。EJB 3.0 版本在之前的版本基础上...

    EJB3.0规范概述

    通过采用元数据支持和O/R映射模型的创新,EJB3.0成功地将开发者从繁琐的配置和代码实现中解放出来,使其更加专注于业务逻辑的设计与实现,从而推动了整个Java企业级应用生态的进化和发展。在未来,随着技术的不断...

    EJB3.0实例教程(含源码)

    不需要学习EJB2.x 也可以直接学习EJB3.0。虽然EJB3 的知识 点有很多,但实用的知识点有7 天的学习时间就足够。作者周未为企业提供培训服务,个人需要培训的话就参加 北京传智播客(www.itcast.cn)的EJB3 培训班吧,...

    EJB3.0开发手册

    #### EJB3.0概述与演变历程 - **EJB的历史地位**:自1999年作为J2EE规范的一部分首次推出以来,EJB(Enterprise JavaBeans)成为了Java企业级开发的重要组成部分。它的出现极大地改变了Java企业级开发的方式,为...

    EJB 3.0 简介

    **EJB 3.0与EJB 2.x的区别** EJB 3.0的主要改进在于简化了API,特别是实体Bean的持久化。对比EJB 2.1,EJB 3.0做了以下改进: 1. **消除了不必要的接口**:不再需要Remote, Home, EJB接口及回调方法实现,减少了...

    java EJB笔记

    EJB 3.0与EJB 2.1的主要区别体现在Entity Bean的持久化API上: 1. EJB 2.1模型需要创建多个组件接口并实现不必要的回调方法,而EJB 3.0消除了这些不必要的接口。 2. EJB 2.0的组件接口要求实现EJBObject或...

    Enterprise JavaBean 3.0, Bill Burke

    随着Web服务的发展,EJB 3.0提供了与Web服务更好的集成能力。通过这种方式,EJB组件可以直接作为Web服务暴露出去,或者消费其他Web服务,进一步增强了系统的互操作性。 #### 三、EJB 3.0 架构概览 EJB 3.0采用了...

    java基础,j2ee框架知识,soap协议webservice技术等(1) java(3) 英文版(1) 宝典(2) 多个关键字请用空格分隔,最多填写5个。点击右侧Tag快速添加(1) EJB3.0(2) Oracle九阴真经(1)

    EJB3.0是J2EE中的一个重要部分,它简化了企业级组件的开发,引入了注解来减少XML配置文件的使用,使得开发过程更为便捷。理解并能熟练运用EJB3.0,能够帮助开发者构建可扩展且高度模块化的分布式系统。 接下来是...

    EJB 30入门经典.ppt

    在EJB 3.0中,实体Bean更像普通的Java对象,负责对象与关系数据库之间的Object/Relational Mapping(O/R Mapping)。使用注解简化了对数据库的映射,不再需要复杂的EntityHome和EntityBean接口。 3. **消息驱动Bean...

    EJB2的3本好书第1本 Head First EJB

    PDF电子书和源代码 EJB2的三本好书第1本,绝对适合初学者,图文并茂,讲述生动,许多艰深的概念讲的很平民化,唯一的不足就是只更新到2.0,没有2.1,...还是可以看看,毕竟很多企业的平台不敢在短时间内追求ejb3.0,风险太大了.

    EJB技术的介绍

    在EJB3.0之后,实体Bean的使用更加简化,通常采用注解的方式来进行O/R映射。 3. 消息驱动Bean(Message-Driven Bean,MDB):这是EJB2.0引入的新类型,主要用于处理Java消息服务(JMS)的消息。MDB是无状态的,它们...

    EJB入门经典ppt.ppt

    2. **实体Bean(Entity Bean)**:实体Bean是与数据库表进行对象关系映射(O/R Mapping)的实体,代表现实世界中的数据对象。在EJB 3.0之后,实体Bean的使用变得更加简化,它们作为普通的Java对象使用,简化了数据...

    jpa的详细java资料

    4. **对象/关系映射 (O/R Mapping)**:为了解决对象模型与关系数据库之间的不匹配问题,EJB3.0 提供了强大的 O/R 映射功能。 5. **广泛的查询能力**:EJB3.0 还提供了丰富的查询接口,以满足各种数据访问需求。 ##...

    Java/JavaEE 学习笔记

    第十四章 标准I/O流与文件.............84 第十五章 网络编程.89 Tiger学习笔记..................94 第一章 Java5.0新特性.......................94 第二章 基础知识.....96 第三章 泛型...........101 第四章 ...

    J2EE学习笔记(J2ee初学者必备手册)

    第十四章 标准I/O流与文件.............84 第十五章 网络编程.89 Tiger学习笔记..................94 第一章 Java5.0新特性.......................94 第二章 基础知识.....96 第三章 泛型...........101 第四章 ...

    ejb3课堂笔记,适合初学者

    - **EJB3.0 编程模型**: - **注解的广泛使用**: 例如`@Stateless`、`@Stateful`、`@Singleton`等注解用于定义EJB类型。 - **生命周期管理**: 容器管理EJB实例的创建、销毁等生命周期事件。 - **依赖注入**: 通过`...

    EJB的详细介绍

    - **持久化模型**:EJB 3.0的持久化模型通过注解简化了对象与数据库的映射,使得ORM更加直观。 - **有状态会话Bean**:可以存储客户端的会话信息,支持更复杂的业务场景。 - **消息驱动Bean**:与JMS的集成,提供...

Global site tag (gtag.js) - Google Analytics