面向方面 vs 面向对象 3(AOP方法)
by Narayanan A.R. June 15, 2005
翻译zhangv (derekzhangv.at.hotmail.com)
原文:http://www.devx.com/Java/Article/28422/0/page/3
图3
图3中描述了AOP方法的设计以及在一个更抽象的层次上类间的交互.你可以通过对比图1和图3来更好地理解AOP.
程序的目的是通过BusinessUnit对象读取CSV文件中的记录然后 填入类BusinessUnitService 中的map.使用AOP来填充这个map有点类似后门(backdoor)方法 -- 控制被委派给BusinessUnit 来读取存储介质中的记录.
AOP就是定义一些point cut(?)和advice.一个point cut是源代码中一个执行点.前面的例子定义了一个pointcut 给类BusinessUnitService中的findBusinessUnits 方法.一个advice就是当执行到point cut时的一块代码.类BusinessUnitPersistentAspect 包括advice方法findAllBusinessUnits,该方法从存储介质中载入数据,然后使用工厂类创建BusinessUnit 对象.然后这个对象被加入map,map对象的引用通过BusinessUnitService 对象获得.point cut 和advice组成了所谓的"方面(Aspect)"
为了读取存储介质中的数据,OOP方法通过一个DAO类来做.而AOP中,你在作用域类中定义一个point cut和一个advice来读取数据.AOP框架会以advice的形式注入代码,既可以在执行期也可以在编译期.
总而言之,当类BusinessUnitService 中的findAllBusinessUnits 方法被调用时,AOP框架会注入advice方法并通过BusinessUnit 对象预先读取数据来填充map对象.这样,持久层方面的代码可以从业务模型中移出.
新方法里的方面
本节讨论如何用AOP为应用程序的各方面建模
操作资源
类BusinessUnitPersistenceAspect 的持久方法使用了一个buffered reader.你甚至可以定义方面的方面,但为了简单,这里的讨论只关注类的查找方法.
- @Aspect("perJVM")
- public class BufferedFileReaderAspect {
- @Expression("execution(* org.javatechnocrats.aop.withaop.aspects.BusinessUnitPersistenceAspect.find*(..))")
- Pointcut businessUnitPersistenceAspect;
- // 其他point cut 定义
- @Expression("businessUnitPersistenceAspect ||
- employeePersistenceAspect ||
- managerPersistenceAspect")
- Pointcut allPersistencePointcuts;
- private Map<Class, String> fileNames;
- public BufferedFileReaderAspect() {
- System.out.println("BufferedFileReaderAspect created");
- fileNames = new HashMap<Class, String>();
- fillFileNames();
- }
- @Before("allPersistencePointcuts")
- public void assignReader(JoinPoint joinPoint) throws Throwable {
- System.out.println("assignReader advice called");
- Object callee = joinPoint.getCallee();
- IBufferedFileReaderConsumable bufReaderConsumable = (IBufferedFileReaderConsumable)callee;
- Class persistenceClass = callee.getClass();
- String fileName = fileNames.get(persistenceClass);
- FileReader fileReader = new FileReader(fileName);
- BufferedReader bufferedReader = new BufferedReader(fileReader);
- bufReaderConsumable.setBufferedReader(bufferedReader);
- }
- @AfterFinally("allPersistencePointcuts")
- public void releaseReader(JoinPoint joinPoint) throws Throwable {
- //释放buffered reader等资源
- }
- //其他方法
- }
上面的代码试图为每一个方法名创建一个point cut -- 所有以find开头的方法.无论何时这些方法被调用,assignReader方法都会被提前执行.这里它获取被调用的类实例然后设置新建的buffered reader.
同样地,在releaseReader 方法里,代码会预先关闭buffered reader集合.本节只解释@before和@
AfterFinally 这两个point cut.(以J2SE 5.0的标记定义).另外,你也可以在方面定义的xml文件中声明他们.你可以查看那例程源代码中的aop.xml文件.
下载
持久化
前面提到,OOP方法使用BusinessUnit 来为应用的持久层填充Map.在下面的高亮代码中(@before一行,以及while循环代码 - 译者注),当BusinessUnitService 中的方法findAllBusinessUnits 被调用时advice方法findAllBusinessUnits 也将被调用.
- @Aspect("perJVM")
- public class BusinessUnitPersistenceAspect implements IBufferedFileReaderConsumable {
- private BufferedReader buffFileReader;
- @Before("execution(Collection org.javatechnocrats.aop.withaop.BusinessUnitService.findAllBusinessUnits())")
- public void findAllBusinessUnits(JoinPoint joinPoint) throws Throwable {
- System.out.println("findAllBusinessUnits advice called");
- Map<String, BusinessUnit> busin
补充:软件开发 , Java ,
上一个:面向方面 vs 面向对象 4(深入代码)
下一个:用vbs实现zip
- 更多JAVA疑问解答:
- java怎么在线读取ftp服务器上的文件内容
- 关于程序员的职业规划
- HTML和JSP矛盾吗?
- java小程序如何打包?
- java怎么split路径文件名?
- 关于Hibernate实体自身多对一的抓取问题
- 关于apache2+tomcat群集出现的问题
- SSH 导入导出excel 谁有这块的资料吗?
- springmvc 加载一个jsp页面执行多个方法 报404
- 关于用jquery 导入 excel
- java对时间进行循环放到List中
- 一个图片的输入输出程序,第一次调用某方法会中断,第二次调用则正常
- 请上过传智播客的人说一下传智播客怎么样呀!是不是像它说的那样好呀!
- spring的schema怎么配置
- 【菜鸟求助】SSH中怎么从JSP页面往后台传值呢