这也是有一个专家组在JCP的组织内完成的, JSR规范的编号是JSR 175, 为JAVA SE 5.0支持注解(Annotation)的功能. 这个规范为EJB3.0 的简化实现提供了一些基本的支持, 也是最关键的支持. 标注可以有自己的属性,也可以定义自己的持续时间,表示这段信息是否保存到 源代码中,还是一直持续到Class中,或者一直保持到运行时间. 标注有自己的缺省值.大多数情况下,无须说明我们就可以推算出来这个对象的行为。 2 轻松的实现开发
2.1 减轻开发人员的负担
EJB3.0的简化工作包括下面几个部分: 提供一个简化的API, 包括对EJB的定义,对EJB的引用等等 减少开发的类数目,不再需要那么多的interface 相关性注入 简化的查询机制 从开发人员的角度不必要使用部署描述文件, 很多的工作可以放到代码里面用标注来说明,比如Entity Bean 的Transaction Type 简化的持久化功能 简化和改善数据对象的O/R Mapping.
标注可以应用到编程语言的一些基本元素上,比如类,方法,变量,包等等. 当我们在代码中使用了这些标注, 根据这个标注对应的持续策略, 它可以被编译到Class 文件中去,或者一直保持到运行的时候。大多数在 EJB 3.0 中定义的标注都是Runtime保持策略, 这样做的好处是提供了最大的灵活性。而且由于大量工作放到了运行的时候来做,也减少一部分Deploy的工作。
我们通过定义缺省的语法来说明大多数常见的情况。开发人员不需要再专门说明常见的情况,“OK, 没问题,缺省的设置就已经可以满足需要了“ 这样,开发人员的工作大大减轻了。 这也引出来了EJB3.0中的一个很有意思的概念 "Configuration By Exception" --只有在例外的情况下才需要我们的参与.
EJB3.0的目标是简化开发人员的工作,让他们专注于商务应用的开发而不是把精力放到很多繁琐的例行工作上,这些工作可以交给Container来完成。EJB通过注入来指定自己需要的资源,不用再写那些麻烦的方法. 将对象的创建和获取提取到外部。由外部容器提供需要的组件。这样,开发人员只用在开始的时候定义,说我需要这个资源, 后面就可以直接使用这个资源, 这样会大大的简化开发, 因为开发人员只用关心如何使用这个对象和商务方法, 而不用担心其他的技术细节。
2.2 抛开繁琐的细节 下面我们看看都作了那些简化。我们的目的是把那些繁琐的技术细节隐藏起来,程序开发人员只用关心自己的商务逻辑代码,而不用关心那些复杂的技术模板,必须实现的接口等,哪怕这些方法和接口根本不需要实现.
不再需要EJB的部件接口 每个EJB 都只是一个普通的JAVA Class 不再需要home接口, 我们不再用home 来创建这个EJB 不再需要实现javax.ejb.EnterpriseBean借口 对于需要在回调方法里实现的部分,我们采用标注的方式说明一个方法为回调方法 不再需要使用复杂的JNDI名字调用机制,对于需要服务或者资源的地方 我们采用了相关性注入的方法,另外也可以通过简化的lookup方法来查找资源
下面让我们看一个简单的无状态SessionBean的例子。无状态session Bean是最简单也是最常用 Bean,很多初学EJB的人都从无状态Session Bean开始。如何让无状态Session Bean 变的简单易用成为一个非常有意义的话题。
前面假设我们已经定义了相关的interface, 这个EJB2.1的的功能是对员工的工资做处理,打开一个数据库连接,进行员工工资信息的某些操作,等等.
// EJB 2.1 public Class PayrollBean implements JAVAx.ejb.SessionBean { SessionContext ctx; DataSource empDB; public void setSessionContext(SessionContext ctx) { this.ctx = ctx; } public void ejbCreate() { Context initialContext = new InitialContext(); empDB = (DataSource)initialContext.lookup( JAVA:comp/env/jdbc/empDB ); } public void ejbActivate() {} public void ejbPassivate() {} public void ejbRemove() {} public void setBenefitsDeduction (int empId, double deduction) { ... Connection conn = empDB.getConnection(); ... } ... } // NOTE deployment descriptor needed
上一篇:Spring Framework中的面向方面编程(AOP),第一部分
下一篇:使用EasyMock使单元测试更加容易
|