|
Liferay 不再依赖于 EJB ,它完全可以单独装配到一个 servlet 容器(如: Tomcat,JBoss 等)中。而所有的业务逻辑都通过 Spring 管理的 POJO 来实现。这样的实现利益于 Spring 的 AOP 各 IOC 特性。 但在POJO的实现方法上Liferay的两个版本有所不同,企业版(enterprise)中通过EJB从而为大站点提供了高扩展性各良好的事务支持能力(如集群),而专业版(professiona)直接通过轻量级的接口完成。
所有的业务数据都通过Hibernate来实现并通过POJO来调用。Liferay曾经使用CMP技术.来实现持久层,但后来因速度及灵活性等原因改用Hibernate。在数据库方面,Liferay也完全兼容大多数主流类型DB。 Liferay使用JAAS来完成用户认证安全管理,好处是当一个用户登录后,它的安全属性可以在Servlet和EJB层中沿用,真正作到系统级的SSO。具体讲,远程EJB可以沿用安全检查及权限属性,本地的EJB是为其它EJB提供业务逻辑服务的,不能被远程调用所以也不必做此类检查;安全原则也派生到POJO实现中,而这此实现其实是远程EJB的基础类。 企业版式使用EJB,所以系统分别可以在WEB服务器、EJB服务器、数据库服务器三层中实现集群。当然在n层的系统中,集群也保持优势,而且在每一层都并不强迫使用集群,这些都为大企业应用提供了极好的弹性选择权。 系统中的EJB、HBM、以及模式Model者是ant执行build-ejb任务时,通过读取目录/portal-ejb下的ejb.xml文件,然后自动生成的。每个有持久层对象的门户单元(portlet)都有自己的ejb.xml文件(可以在/portal-ejb下搜索得到清单)。当需要生成持久层的类时,就把文件复制到/portal-ejb下,这生成工具是建立在XDoclet之上的。 例如:通过读取Bookmarks门户单元的ejb.xml文件配置后,自动生成下列的模式类。每个类对应数据库中的一个表。永远不要手工修改BookmarksEntryModel类,而要通过修改BookmarksEntry,然后再更新BookmarksEntryModel内容。这样做的好处是减少了直接写代码的工作,而只做相应的标记工作。 com.liferay.portlet.bookmarks.model.BookmarksEntry com.liferay.portlet.bookmarks.model.BookmarksEntryModel com.liferay.portlet.bookmarks.model.BookmarksFolder com.liferay.portlet.bookmarks.model.BookmarksFolderModel Hibernate类是根据模式(model)类对应生成的。这样就可以在多层系统中允许模式类是可作序列化处理的,而Hibernate类则不必。 com.liferay.portlet.bookmarks.ejb.BookmarksEntryHBM com.liferay.portlet.bookmarks.ejb.BookmarksFolderHBM 持久层的方法如:add, update, delete, find, remove, 以及count,系统都默认自动生成。 com.liferay.portlet.bookmarks.ejb.BookmarksEntryPersistence com.liferay.portlet.bookmarks.ejb.BookmarksFolderPersistence 也生成了专门的协助类(Helper classes),可以用来调用持久层方法。默认时,协助类调用Hibernate的方法来对数据库进行更新操作,但是也可以改写portal.properties中的配置,使用自己专用的类来完成,但这种类要求要继承默认的持久层类。换言之,用户完全可以定制自己的持久层数据,可以是一个正统的数据库,或者是LDAP服务器,其它什么的。 com.liferay.portlet.bookmarks.ejb.BookmarksEntryUtil com.liferay.portlet.bookmarks.ejb.BookmarksFolderUtil 为了减少对象生成的成本,引入了对象池,可以通过修改portal.properties文件来控制池的基本动作。 com.liferay.portlet.bookmarks.ejb.BookmarksEntryPool com.liferay.portlet.bookmarks.ejb.BookmarksFolderPool 用来实现业务逻辑的POJO类,通过继承PrincipalBean类,来实现有关调用者的方法,所以可以远程调用。如:调用getUserId()可以得到当前用户的ID;调用getUser()则返回当前用户的对象。EJB再继承这类POJO,实现远程调用。 例如:下面的类实现了,允许当且公当bookmark项目或目录的生成者可以删除它。这些对象只有在不存在时才可能被创建。 协助类(Helper classes)是在POJO的实现基础上生成的。它可以节约开发者的工作,不必书写很多行的代码,而只要简单的找到合适的EJB wrapper或POJO实现,通过调用BookmarksEntryManagerUtil.addEntry来间接调用相应的BookmarksEntryManagerImpl.addEntry方法就可以了。 BookmarksEntryManagerUtil通过调用BookmarksFolderManagerFactory来查找实现BookmarksEntryManager的类。也正是通过BookmarksFolderManagerFactory来识别Spring和portal.properties中的配置来决定要是载入EJB wrapper还是POJO实现。 com.liferay.portlet.bookmarks.ejb.BookmarksEntryManager com.liferay.portlet.bookmarks.ejb.BookmarksEntryManagerEJB com.liferay.portlet.bookmarks.ejb.BookmarksEntryManagerEJBImpl com.liferay.portlet.bookmarks.ejb.BookmarksEntryManagerFactory com.liferay.portlet.bookmarks.ejb.BookmarksEntryManagerHome com.liferay.portlet.bookmarks.ejb.BookmarksEntryManagerUtil com.liferay.portlet.bookmarks.ejb.BookmarksFolderManager com.liferay.portlet.bookmarks.ejb.BookmarksFolderManagerEJB com.liferay.portlet.bookmarks.ejb.BookmarksFolderManagerEJBImpl com.liferay.portlet.bookmarks.ejb.BookmarksFolderManagerFactory com.liferay.portlet.bookmarks.ejb.BookmarksFolderManagerHome com.liferay.portlet.bookmarks.ejb.BookmarksFolderManagerUtil 隧道类(Tunneling classes)是用来实现通过80端口来调用POJO的。 com.liferay.portlet.bookmarks.ejb.BookmarksEntryManagerHttp com.liferay.portlet.bookmarks.ejb.BookmarksFolderManagerHttp Soap类也是用来实现通过80端口来调用POJO的。虽然与隧道类相比Soap类在速度上要差一点,原因是隧道类使用二进制数据流。但Soap类用灵活,可以适用各种客户端(不局限于Java)。 com.liferay.portlet.bookmarks.ejb.BookmarksEntryManagerSoap com.liferay.portlet.bookmarks.ejb.BookmarksFolderManagerSoap Soap类也是用来实现通过80端口来调用POJO的。虽然与隧道类相比Soap类在速度上要差一点,原因是隧道类使用二进制数据流。但Soap类用灵活,可以适用各种客户端(不局限于Java)。这些类只有在检验到不存在时才会被创建。同时协助类也生成了。 com.liferay.portlet.bookmarks.ejb.BookmarksEntryLocalManager com.liferay.portlet.bookmarks.ejb.BookmarksEntryLocalManagerEJB com.liferay.portlet.bookmarks.ejb.BookmarksEntryLocalManagerEJBImpl com.liferay.portlet.bookmarks.ejb.BookmarksEntryLocalManagerFactory com.liferay.portlet.bookmarks.ejb.BookmarksEntryLocalManagerHome com.liferay.portlet.bookmarks.ejb.BookmarksEntryLocalManagerUtil com.liferay.portlet.bookmarks.ejb.BookmarksFolderLocalManager com.liferay.portlet.bookmarks.ejb.BookmarksFolderLocalManagerEJB com.liferay.portlet.bookmarks.ejb.BookmarksFolderLocalManagerEJBImpl com.liferay.portlet.bookmarks.ejb.BookmarksFolderLocalManagerFactory com.liferay.portlet.bookmarks.ejb.BookmarksFolderLocalManagerHome com.liferay.portlet.bookmarks.ejb.BookmarksFolderLocalManagerUtil 但总有一些用户需要调用引种当地类,于是完全相对应的远程类也应用而生了。 com.liferay.portlet.bookmarks.ejb.BookmarksEntryRemoteManager com.liferay.portlet.bookmarks.ejb.BookmarksEntryRemoteManagerEJB com.liferay.portlet.bookmarks.ejb.BookmarksEntryRemoteManagerEJBImpl com.liferay.portlet.bookmarks.ejb.BookmarksEntryRemoteManagerFactory com.liferay.portlet.bookmarks.ejb.BookmarksEntryRemoteManagerHome com.liferay.portlet.bookmarks.ejb.BookmarksEntryRemoteManagerUtil com.liferay.portlet.bookmarks.ejb.BookmarksFolderRemoteManager com.liferay.portlet.bookmarks.ejb.BookmarksFolderRemoteManagerEJB com.liferay.portlet.bookmarks.ejb.BookmarksFolderRemoteManagerEJBImpl com.liferay.portlet.bookmarks.ejb.BookmarksFolderRemoteManagerFactory com.liferay.portlet.bookmarks.ejb.BookmarksFolderRemoteManagerHome com.liferay.portlet.bookmarks.ejb.BookmarksFolderRemoteManagerUtil 许多人避免使用EJB,因为它的重量级,需要大量的代码工作。Liferay的自动生成脚本可以使得,既不损失EJB的优点,而且还最小化重复的代码等工作,从而你可以在努力与结果之间找到一个良好的平衡点。
Spring也给Liferay带来了更多的好处。开发者既可以利用专业版在一个servlet容器中测试POJO的实现,也可以通过企业版在应用服务器上装载要上线的产品。
|