Spring是J2EE开发中非常流行的框架,他最重要的两大基本功能是提供IoC容器和AOP概念的实现。这里介绍一下AOP,它的全名为Aspect-Oriented Programming,可翻译为面向层面编程。下面介绍一些AOP的基本术语和概念。
1.Cross-cutting concern:我们编写的程序主要是为了实现业务逻辑,因此主要的代码是业务流程代码,但是出于需要会加入日志、安全检查、数据库事务等系统层面的代码。这些动作在AOP中被称为Cross-cutting concerns。这类代码被硬生生地横切(Cross-cutting)入业务代码中,使得程序逻辑更为复杂,增加了软件的维护成本。
2.Aspect:将散落于各个业务逻辑中的Cross-cutting concerns收集起来,设计成各个独立可重用的对象,这些对象称为Aspect。例如将写日志动作设计为一个LogHandler类,LogHandler实现InvocationHandler接口,在invoke方法中调用业务方法之前或之后加入日志代码。这是一种代理模式,InvocationHandler接口是JDK的动态代理API中的一个接口。这个LogHandler类就是一个Aspect。事实上,在Spring中,开发者并不会需要设计一个这样的类,而是由Spring通过配置文件自动生成,因此它更多地存在于概念中。对应的注解为@Aspect 。
3.Advice:Aspect中对于Cross-cutting concerns的具体实现称之为Advice。比如LogHandler类的invoke方法,就是一个Advice。Advice中包括了日志程序代码是如何实现的。
invoke方法的代码大致如:
public Object invoke (Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
try {
logger.log("start: "+method);
result = method.invoke(delegate, args);
logger.log("end: "+method);
} catch (Expcetion e) {
logger.log(e.toString());
}
这三者的关系可概括为:从若干Cross-cutting concerns中辨识出Aspects,具体设计为Advices。在Spring中Advice一般会设计成单独的实现类。一般使用注解@After、@Beforre、@Around 来定义Advice 。
4.Joinpoint:Advice在应用程序执行时加入业务流程的点或时机称之为Joinpoint,具体地说,就是Advice在应用程序中被执行的时机。Spring只支持方法的Joinpoint,可以在方法被执行之前或之后,或发生某个异常时执行。
5.Pointcut:Pointcut定义了感兴趣的Jointpoint(也可以反过来说,符合Pointcut条件的每一个被拦截处即为连接点--Joinpoint),当调用的方法符合Pointcut表示式时,将Advice织入到程序中。在Spring中,通过配置文件或Annotation方式编写的Pointcut,当调用的方法符合配置文件中定义的Pointcut表示式时,将相应的Advice应用于程序。@After、@Beforre、@Around的参数的拦截规则就是Pointcut 。为了使Pointcut复用,可以使用@Pointcut专门定义拦截规则。
6.Target:一个Advice被应用于的对象。
7.Introductiuon:对于一个现存的类,Introduction可以为其增加行为,而不用修改该类的程序。
8.Weave:Advice被应用至对象之上的过程称之为织入(Weave)。