不久前, JBoss 发布了新版本的 JBoss AS 6 应用服务器,该新版本提供了对 Java EE 6 Web Profile 的完整支持。David Salter 则在自己的博客中详细介绍了EJB 3.1 的新特性。
EJB 3.1 的 3 个主要新特性是:
- EJB 可以作为 WAR 文件的一部分部署,无需提供单独的 EJB JAR 文件
- 可以开发无业务接口的 EJB
- 可以将 EJB 部署为 Singleton
下面分别来看看这 3 个新特性。
EJB 可以作为 WAR 文件的一部分部署。
如果使用 NetBeans 进行开发,那么你可以创建一个简单的 Java EE 6 Web 项目,然后在该 Web 项目内创建 EJB。如果开发的是 Web 项目,那么无需添加额外的 JAR 文件就可以部署任何 EJB。
可以开发无业务接口的 EJB
创建无业务接口的 EJB 就像创建 POJO 一样简单。现在,可以像下面的代码一样定义 EJB:
复制代码
package com.davidsalter.ejb31test; import javax.ejb.Stateless; @Stateless public class HelloSessionBean { public String sayHello() { return "Hi there !!"; } }
与 POJO 唯一的差别在于该类使用了注解 @Stateless,这表明它是一个 Stateless Session Bean。
如果将包含该 EJB 的 WAR 文件部署到 JBoss 中,那么在部署成功后我们会在 JBoss 控制台上看到如下消息:
复制代码
21:08:29,653 INFO [org.jboss.ejb3.nointerface.impl.jndi.AbstractNoInterfaceViewBinder] Binding the following entry in Global JNDI for bean:HelloSessionBean HelloSessionBean/no-interface -> EJB3.1 no-interface view
从 Web 项目中调用 EJB 是相当简单的事情。我们可以使用 @EJB 注解将 EJB 注入到 Servlet 中。如下代码所示:
复制代码
public class HelloServlet extends HttpServlet { @EJB HelloSessionBean helloSessionBean; ... PrintWriter out = response.getWriter(); out.println(helloSessionBean.sayHello());
可以将 EJB 部署为 Singleton
现在,可以通过 @Singleton 注解将 EJB 声明为 Singleton。如果使用 @PostConstruct 与 @PreDestroy 注解,那么就可以在该 Singleton 上轻松实现任意的初始化与清理动作了。被 @PostConstruct 所注解的方法会在该 Singleton 首次构造之后得到调用,比如说当调用了 Singleton 的某个 Servlet 或是某个 JSF 的 backing bean 首次加载时。被 @PreDestroy 所注解的方法会在该 Singleton 销毁前得到调用,因此该方法可用于执行资源清理操作。
以这种方式定义 Singleton 可用于存储应用的多个客户端所需要的数据,如下代码所示:
复制代码
package com.davidsalter.ejb31test; import java.util.Date; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.ejb.Singleton; @Singleton public class SingletonSessionBean { private String creationDate; @PostConstruct public void init() { System.out.println("Initialize singleton"); creationDate = new Date().toString(); } @PreDestroy public void shutdown() { System.out.println("Shutting down singleton"); } public String getDate() { return creationDate; } }
调用 Singleton 与之前调用 Session Bean 一样简单,如下代码所示:
复制代码
@EJB SingletonSessionBean singletonSessionBean;
感兴趣的读者可以从这里下载完整的示例代码并实际运行。
评论