快速业务通道

J2EE应用下基于AOP的抓取策略实现 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-25
ion(* EmployeeDetailsService.getEmployeeWithDependentDetails(int))); /**   When you are at the specified poincut before continuing further update the fetchingStrategy in   EmployeeRepositoryImpl to EmployeeWithDependentFetchingStrategy */ before(EmployeeRepositoryImpl r): empWithDependentDetail() && target(r) { r.fetchingStrategy = new EmployeeWithDependentFetchingStrategy(); }

这样,Repository到底要执行何种查询就不是由Service和Repository层所决定了,而是由外面的Aspect决定,纵使增加了新的业务也无需修改底层服务和Repository层。决定执行何种查询的逻辑就成为一个横切关注点了,它被放在Aspect中。Aspect会根据业务规则的不同在Service层调用Repository层的API之前将抓取策略注入到Repository中。这样我们就可以使用相同的Service和 Repository层API来满足各种不同的业务规则了。

来看个具体示例吧,该示例会同时抓取一个employee的Department和Dependent的详细信息。我们需要对业务层进行一些变更,增加一个方法:getEmployeeWithDepartmentAndDependentsDetails(int employeeId)。实现新的抓取策略类EmployeeWithDepartmentAndDependentFetchingStaratergy,后者又实现了EmployeeFetchingStrategy并重写了queryEmployeeById方法,该方法会返回优化后的查询,可以在一个SQL语句中获取所需数据。

由Aspect将上述的抓取策略注入到相关的业务中,如下所示:

pointcut empWithDependentAndDepartmentDetail(): call(* EmployeeRepository.findEmployeeById(int)) && cflow(execution(* EmployeeDetailsService.getEmployeeWithDepartmentAndDependentsDetails(int))); before(EmployeeRepositoryImpl r): empWithDependentAndDepartmentDetail() && target(r) {    r.fetchingStrategy = new EmployeeWithDepartmentAndDependentFetchingStaratergy(); }

J2EE应用下基于AOP的抓取策略实现(4)

时间:2009-10-10 infoq Manjunath R Na

如你所见,我们并没有修改底层业务与Repository层而是使用Aspect和一个新的FetchingStrategy实现就完成了上述新增的业务。

现在我们来谈谈关于二级缓存的查询优化问题。在上面的示例代码中,我们对department实体进行一些修改并配置在二级缓存中。如果对 department实体采取预先抓取,那么对于同样的department实例,纵使它位于二级缓存中,每次也都需要查询数据库。如果不在查询中获取 department实体,那么业务层就需要参与到事务当中,因为我们并没有将department实体缓存起来而是通过延迟加载的方式得到它。

这样,事务声明就从底层移到了业务层,虽然我们知道该业务需要哪些数据,但O/R Mapping工具却没有提供相应的机制来解决上面遇到的问题,即预先抓取缓存中的数据。

对于那些没有缓存的数据来说这种方式没什么问题,但对于缓存数据来说,这就依赖于O/R Mapping工具了,因为只有它才能解决缓存数据问题。

该示例附带的源代码详细解释了抓取策略。该zip文件含有一个工程示例,阐述了上面谈到的所有场景。你可以使用任何IDE或是使用aspectj编译器从命令行执行代码。在执行前请确保jdbc.properties文件与你机器上的信息一致并创建示例应用所需的表。

你可以使用Eclipse IDE以及AJDT插件运行代码,请按照下面的步骤进行:

解压缩下载好的代码并将工程导入到Eclipse中。

配置Resources/dbscript目录下的jdbc.properties文件中的数据库信息。

完成上面的步骤后请执行resources\dbscript\tables.sql脚本,这将创建该示例应用所需的表。

以AspectJ/Java

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号