J2EE 1.4特别是EJB 2.X技术不便于高效地进行开发,所以转向POJO和Web容器成为许多“企业级”项目的选择。
一些项目甚至搭建自己的架构,为的就是避免使用EJB 2.0。然而,如今开发环境和运行环境已经发生了巨大的变化。Java EE 5 和EJB 3.0 为开发尤其是部署模式带来了显著地简化。巨大的部署描述符不再需要(甚至根本不再需要XML) ,开发一个 session bean只需要一个类和一个接口。 实际上对EJB 3.0已经很难再做进一步的简化 (欢迎提出你的意见)。
有趣的是:在Java EE 5中,不含EJB 3 Session Bean 的Web应用反而相比显得复杂。我从蓝皮书 中拷贝了下面的例子,我们来看看不用EJB时,需要哪些额外的代码:@PersistenceContext(name="foo", unitName="myPuName")
public class MyServlet extends HttpServlet { @Resource UserTransaction utx;
public void doGet(HttpServletRequest req,
HttpServletResponse resp) throws throws ServletException, IOException { EntityManager em = (EntityManager) ic.lookup("java:comp/env/foo"); 当然没有人愿意在Servlet中直接使用EntityManager,而是会在比如Struts的 Action或是JSF的managed bean中使用,但是你同样必须小心地处理lookup,线程安全和事务管理,如上面例子所示。
//get data from request
String name = request.getParameter("item_name");
...
//create new Item entity
Item item = new Item();
//set values of Item entity
item.setName(name);
...
utx.begin();
em.persist(item); //persist and add new Item to database
utx.commit();
...
}
这种情形可以通过使用Session Bean来显著地做到简化,因为容器会来处理EntityManager,并发以及事务。
servlet的代码如下所示: public class MyServlet extends HttpServlet { @EJB ItemMgr mgr;
public void doGet(HttpServletRequest req,
HttpServletResponse resp) throws throws ServletException, IOException {... mgr.addItem("name of item");EJB bean的代码也非常简单:public class ItemMgrBean{
@PersistenceContext EntityManager em;
public void addItem(String name){ Item item = new Item();
item.setName(name);
em.persist(item); }这里的代码简单而且清晰。资源被管理并被注入到容器中。通过使用Session Bean技术,可管理性和可监控性明显提高。通过像Glassfish的 call flow 这样的工具,你可以监控整个调用过程的性能。最酷的事是,XML的配置仍是可选的。在EJB 3.1中甚至连local interfaces也是可选的。 EJB在3.1之后,不会再有简化的空间了:-)