随着ejb3的出现,ejb又开始了它的第二春。Ejb3相比ejb2,简单了许多。这一点从很多方面能够看出来。
有了一段Ecplise+Lomboz和IBM RAD开发EJB2的经历之后,深深的感觉EJB2的复杂性。我们会为了XXXBean.findUserById(String userId)这个方法,要做很多前期的代码生成,最后要通过JNDI来lookUp相应的EJB接口,最后再调用相应的业务逻辑。
还好我们有Lomboz或者RAD,如果没有这些工具,那么可想而知其繁杂程度。这也能说明人们那时候为什么会抱怨EJB2的复杂性。
还好,EJB3出现了,我们能够发现EJB3不再EJB2中需要的两个接口,而且提供了注解的方式来定义Session的类型。
@Stateless @Remote(UserManagerBean.class) @Local(UserManagerBean.class) publicclass UserManager implements UserManagerBean { public void addUser(User user) { user.setId(10); } }
而且EJB3使用了IOC的方式来代替了home接口的ejbcreate创建EJB远程或本地接口的方式。这点在EJB3的开发代码中我们能够察觉到,我们没有了HOME接口,也看不到那些ejbcreate等容器要处理实现的方法。
之所以说EJB3使用的是IOC的方式来创建ejb远程接口或本地接口对象的,是因为我们能够在EJB3的代码中找到@EJB的注解。
@ejb private UserManageruserManager; userManager.addUser(user);
学过Spring的应该对这个知识非常熟悉。通过这个IOC的技术使用能够很好的看出来SUN公司的那种勇于否定自己的精神,不断进取的精神。当然通过这个IOC技术能够很好的减少了或者不再让用户和JNDI打交道,因为我们知道其实EJB2的复杂性另一个原因就是因为JNDI,虽然说JNDI在J2EE架构中起着举足轻重的作用,但是我们在做EJB2的开发实践的时候我们就会发现JNDI的配置是一件非常繁琐的事情。所以EJB3果断选择IOC的注解来解决这样的复杂性问题。
还有一点EJB3优于EJB2的地方是在持久化方面,EJB3采用的是JPA来代替了EJB2的EntityBean,这样也比EJB2简单很多,开发过EJB2实体bean的可能会比较认同,EJB2的实体bean是需要在Model类和实体Bean中进行一次转换:
/** *ejbCreate *@ejb.create-method * view-type="local" */ public java.lang.IntegerejbCreate(UserDTO userDTO)throws CreateException{ setName(userDTO.getName()); setPassword(userDTO.getPassword()); setEmail(userDTO.getEmail()); setUser_id(userDTO.getUser_id()); return null; }
而EJB3的JPA技术就像Hibernate持久性框架类似,只需pojo+Annotation就能将Entity持久化到数据库中,从而简化了复杂性。
从上面的内容我们能够看出来EJB3比EJB2简单许多,而且在一些关键技术上做出了修改,也就是这些修改的背后能够带给我们很多重要的东西,也许这些东西才是我们最需要的。