(三)前瞻EJB 3.0
基于POJO中间件的理念植根于开源项目。现在它正朝着J2EE的标准化迈进。即将来临的由JSR(Java 规范要求)220专家组开发的EJB 3.0 规范将使用POJO作为EJB的构件,并将在诸多场合摒弃部署文件的需要。作为一个开源的主角,简单化POJO模型的倡议者,JBoss是EJB 3.0背后驱动力的一员。
EJB 3.0 编程模型和API类似于JBoss AS 4.0 的POJO模型。因而,移植JBoss AS 4.0 POJO应用和相关的开发技术到未来的EJB服务器将被证明是简单的。
如果今日你想与明日的EJB 3.0 技术共舞,你可以从JBoss 上下载和安装JBoss AS 4.0 的EJB 3.0 预览版模块。JBoss EJB 3.0预览实现是基于JBoss AOP和Hibernate的。预览版软件基于EJB 3.0的一份草案,并将受将来变化的影响。
核对你的JBoss版本
请确保你有安装正确JBoss版本支持EJB 3.0模块。例如JBoss EJB 3.0 预览2模块仅仅与JBoss AS 4.0.0 RC1一起工作。当新的EJB预览版本发行的时候,这将受其影响。你可以在EJB 3.0模块的安装文档里找到最新的信息。
为了展示EJB 3.0的如何工作的,我将使用EJB 3.0 的API重新实现抵押金计算器应用。你可以在EJB3源码目录建造。一旦部署,访问EJB 3.0 应用的URL将是
http://localhost:8080/MortgageCalculatorEJB3/servlet/Calculator,建造该EJB 3.0 应用,J2SE 5.0是必须的。
如下代码所示,Calculator接口声明了基于POJO的会话Bean.@local注解标签指定了EJB 3.0 会话Bean与其客户(即Servlet 模块)部署在同一个JVM上。因此Servlet将通过它的Java引用访问该会话Bean,也就避免了缓慢对象序列化操作。如果会话Bean在不同的服务器上运行,你可以在该接口上加注@remote标签。
@Local
public interface Calculator {
public double getPayment (int principal, double rate, int term);
// Get previous queries that has payment lower than
// the current one
public List getHistory (double payment);
}
CalculatorBean类是会话Bean的实现,我们用@stateless标签将其声明为一个无状态的会话Bean
@Stateless
@SecurityDomain("other")
public class CalculatorBean implements Calculator {
@Inject
private EntityManager manager;
public CalculatorBean () { }
@MethodPermissions({"AuthorizedUser"})
@Tx(TxType.REQUIRESNEW)
public double getPayment (int principal, double rate, int term) {
rate = rate / 100.;
rate = rate / 12.;
double tmp = Math.pow(1.+rate, term);
tmp = (principal * tmp * rate) / (tmp – 1.);
HistoryBean history =
new HistoryBean (principal, rate * 1200., term, tmp);
manager.create (history);
return tmp;
}
@MethodPermissions({"AuthorizedUser"})
@Tx(TxType.REQUIRESNEW)
public List getHistory (double payment) {
return manager.createQuery(
"from HistoryBean h where h.payment < :payment")
.setParameter("payment", new Double(payment))
.listResults();
}
}
HistoryBean类是对数据库进行持久化的数据模型。查看一下我们如何用注解来避免对对象数据库表映射文件的需要的。另外,EntityManager替代了POJO样例里的HibernateContext对象。运行时,注解将EntityManger对象注入HistoryBean对象,因此我们无须与JNDI设置和命名纠缠。
@Entity
@Table(name = "history")
public class HistoryBean {
private int id;
private int principal;
private double rate;
private int term;
private double payment;
public HistoryBean () {
}
public HistoryBean (int principal, double rate,
int term, double payment) {
this.principal = principal;
this.rate = rate;
this.term = term;
this.payment = payment;
}
@Id(generate = GeneratorType.AUTO)
public int getId () {
return id;
}
public void setId (int id) {
this.id = id;
}
public int getPrincipal () {
return principal;
}
public void setPrincipal (int principal) {
this.principal = principal;
}
public double getRate () {
return rate;
}
public void setRate (double rate) {
this.rate = rate;
}
public int getTerm () {
return term;
}
public void setTerm (int term) {
this.term = term;
}
public double getPayment () {
return payment;
}
public void setPayment (double payment) {
this.payment = payment;
}
}
总的来说,除了EJB 3.0 实体Bean模型相对基于Hibernate的POJO模型简单,用EJB 3.0写就的应用与JBoss AS 4.0的POJO应用是相似的。图4 显示了基于 EJB 3.0的抵押金计算器应用的结构。
图 4 EJB 3.0 模块中的关键构件。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
相关推荐
-
中间件可帮助企业实现应用现代化
本文,Tom Nolle讲述了大家都需要了解的现代化的流行做法,“中间件”方式——解释了如何确保采用的是正确方法,如何简化流程,并且为将来做好准备。
-
云连锁反应:中间件栈添层 应用更轻量
中间件栈增加了层以及对轻量应用的开发需求将导致更好的云访问,而云的无所不在增加了中间件栈的层次。
-
如何应对中间件工具引发的安全风险
中间件工具会引起巨大的漏洞,足以抵消所带来的好处。然而,通过一些简单的步骤你就可以保护自己和数据。
-
越来越强大的IT标准、SOA及其他颠覆性技术
在本期问答环节中,我们将荣幸的邀请到来自Open Group的Chris Harding先生与我们一起讨论他对IT标准、SOA以及移动和云计算等科技未来的发展情况。