Tag Archives: aop

Spring 2.5 AOP Schema编程小解

AOP是已经是蔓延了好几年的话题,不过因为没有标准化的平台以及工具的缺乏,一直没有很好的推广。这里所用的AOP实现主要是Spring对AspectJ的封装。感谢Spring的出色贡献,我们甚至都不用知道什么是AspectJ就可以使用AOP概念进行程序设计和实现了。

AOP编程模型

通常情况下,程序中有很多公共的部分,比如事务控制,比如LOG记录。他们遍布程序各处,使代码凌乱不堪难以维护。AOP是对OOP一个很好的补充。OOP很好的描述了业务模型中各个组件的交互方式,但是对于系统组件的装配与互操作,却鲜有明确的定义。

下面就是这样的一个应用场景,对于一个业务方法,比如queryUserInfo我们都需要事务控制,日志记录。

从业务方法角度看AOP

AOP  Example 1

在每一次调用业务方法时,AOP框架会使用around方式调用装配给业务方法的adviser..(可能更好理解的方式是类似 beforeMethod, afterMethod…)。

从Adviser看AOP

image

一个Adviser可能被装配给多个业务类的多个方法,通过不同的操作模型完成相关任务。

Spring 2.5 与AOP实现

下面通过一个非常简单的例子来说明Spring中AOP的Schema配置实现方式。

在此之前,应当对Spring 2.5 的Schema机制以及AOP AspectJ编程的一般概念有所了解。

请先阅读

下面是AOP的配置spring bean xml 文件


http://www.springframework.org/schema/beans" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	
		
		
			
			
			
			
			
			
			
			
		
	
	
	
	

	
		
		
		
		
			
		
	

	
	
	


下面是 org.ave7.ws.aop.SystemMonitor 类的实现代码

package org.ave7.ws.aop;

import org.aspectj.lang.ProceedingJoinPoint;

import org.apache.commons.collections.LRUMap;
import org.apache.commons.lang.builder.ReflectionToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.apache.commons.lang.time.DurationFormatUtils;
import org.apache.commons.lang.time.StopWatch;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class SystemMonitor {

    private static final LRUMap logMap = new LRUMap(100);

    // 参数call包含了被调用方法的相关信息,请参考ApectJ网站
    public Object profileMethod(ProceedingJoinPoint call) throws Throwable {
        Log log = obtainLogger(call.getTarget().getClass());
        if (log.isDebugEnabled()) {
            log.debug("call " + call.getSignature().toLongString());
            log.debug("with para: "
                    + ReflectionToStringBuilder.toString(call.getArgs(),
                            ToStringStyle.MULTI_LINE_STYLE, true));

            StopWatch watch = new StopWatch();

            watch.start();

            try {
                Object rt = call.proceed();

                log.debug("return : "
                        + ReflectionToStringBuilder.toString(rt,
                                ToStringStyle.MULTI_LINE_STYLE, true));
                return rt;
            } catch (Throwable e) {
                log.warn("exception: " + e.getMessage(), e);
                throw e;

            } finally {
                watch.stop();
                log.debug("executing time: "
                        + DurationFormatUtils.formatDuration(watch.getTime(),
                                "m:s.S"));

            }
        } else {
            return call.proceed();
        }

    }

    private Log obtainLogger(Class clazz) {

        Log log = (Log) logMap.get(clazz);
        if (null == log) {
            log = LogFactory.getLog(clazz);
            logMap.put(clazz, log);
        }
        return log;
    }

}

Dynamic Language and DSL

这是一篇技术评论,呃,请自行掠过

早上拜读了Martin Fowler老人家的BLOG Groovy or Ruby ,兴致勃勃的看这个时尚的家伙对动态语言的高谈阔论。下午就在InfoQ看到了对其新书的点评——Martin Fowler unveils details of his upcoming DSL book. 两样东西放到一起很有意思。动态语言与领域语言(Domain-Specific Language)。

MF的书中是这样介绍的。

如果我们把XSLT看成是专门格式化XML的语言,那么XSLT就是XML的DSL。

那么DSL有什么用呢?

根据MF的论述 Domain-Specific Language

DSL与通用语言相区别,是为特定目的而生的语言,它并不是什么新东西,历史几乎和计算机的历史一样长。

比如Windows的批处理文件,再比如HTML(某种意义上)。处理它们的程序和普通的应用程序不一样,这些程序并不知道这些语言具体描述了什么,却知道他们到最后大概是什么样子。但我们也不能把这些应用程序归结为系统程序,毕竟,你不能用这些动态语言写成任何一个通常意义上的程序。这些语言轻巧灵活,惹人喜爱,却长期处于没人在乎的地位。几乎没有任何一个大学开设JavaScript或者BAT的课程。然而,用它们开发的程序铺天盖地,甚至有些开发者都没有意识到他们在写程序。

我们到底有多少DSL,没有人说的清楚,甚至怎么界定都没有标准。然而这种工具的确越来越受重视。大型的软件通常都有自己的工具语言,比如SAP,比如PepleSoft,比如MathLib,比如SAS,掌握这些工具通常意味着熟练应用这些语言与相关的领域知识。而由于他们之间毫无联系,同种软件之间有着高昂的替换成本。变相垄断使得DSL由最初的简化用户操作变成了对抗新来者的武器。

标准化是由混乱走向秩序的利器。工业化也是软件行业一直追求的目标。让我们看看工业界是怎么做的,他们拥有流水线,有很好的设计,生产,销售流程。我们常常抱怨软件的变化,生产没有变化吗?现在工业可以高效的适应变化,依靠的就是对领域的深切理解,对规则的灵活掌握。

对标准的无尽追寻是业界走向成熟的重要标志。不妨设想,今后的某天,所有的财务软件都有统一的口径标准,统一的数据格式处理流程。集团化,高质量的软件生产和部署使我们更加有序的获取所需的功能。然而这一切,依靠的就是对DSL领域的入侵。Ruby的流行正式反映了这种入侵,当其追逐者不断的在各种平台上实现这门语言的时候,我们也看到了传统语言正积极的调整。Java向.net学习多语言支持。.net努力的靠近开源社区的标准。

我们说GOP,说AOP,无非就是想把领域问题(Domain Problem)从应用问题里面解离,我们需要成熟的软件产品,需要的是真正模块化的组件,而不是某个既成事实。被巨头们忽悠着团团转的我们,也只能等到他们被迫合作的时候,才能轻松一点。