日期:2014-05-17  浏览次数:20959 次

【第六章】 AOP 之 6.4 基于@AspectJ的AOP ——跟我学spring3

? ? ? ?Spring除了支持Schema方式配置AOP,还支持注解方式:使用@AspectJ风格的切面声明。

6.4.1? 启用对@AspectJ的支持

?????? Spring默认不支持@AspectJ风格的切面声明,为了支持需要使用如下配置:

?

java代码:
<aop:aspectj-autoproxy/>

?

这样Spring就能发现@AspectJ风格的切面并且将切面应用到目标对象。

6.4.2? 声明切面

?????? @AspectJ风格的声明切面非常简单,使用@Aspect注解进行声明:

?

java代码:
@Aspect()
Public class Aspect{
……
}

?

?????? 然后将该切面在配置文件中声明为Bean后,Spring就能自动识别并进行AOP方面的配置:

?

java代码:
<bean id="aspect" class="……Aspect"/>

?

?????? 该切面就是一个POJO,可以在该切面中进行切入点及通知定义,接着往下看吧。

?

6.4.3? 声明切入点

?????? @AspectJ风格的命名切入点使用org.aspectj.lang.annotation包下的@Pointcut+方法(方法必须是返回void类型)实现。

?

java代码:
@Pointcut(value="切入点表达式", argNames = "参数名列表")
public void pointcutName(……) {}
 

? ? ? ?value指定切入点表达式;

? ? ? ?argNames指定命名切入点方法参数列表参数名字,可以有多个用“,”分隔,这些参数将传递给通知方法同名的参数,同时比如切入点表达式“args(param)”将匹配参数类型为命名切入点方法同名参数指定的参数类型。

? ? ? ?pointcutName切入点名字,可以使用该名字进行引用该切入点表达式。

?

java代码:
@Pointcut(value="execution(* cn.javass..*.sayAdvisorBefore(..)) && args(param)", argNames = "param")
public void beforePointcut(String param) {}

?

定义了一个切入点,名字为“beforePointcut”,该切入点将匹配目标方法的第一个参数类型为通知方法实现中参数名为“param”的参数类型。

?

6.4.4? 声明通知

?????? @AspectJ风格的声明通知也支持5种通知类型:

?

一、前置通知:使用org.aspectj.lang.annotation 包下的@Before注解声明;

?

java代码:
@Before(value = "切入点表达式或命名切入点", argNames = "参数列表参数名")

?

? ? ? ?value指定切入点表达式或命名切入点;

? ? ? ?argNames与Schema方式配置中的同义。

?

接下来示例一下吧:

1、定义接口和实现,在此我们就使用Schema风格时的定义;

2、定义切面:

?

java代码:
package cn.javass.spring.chapter6.aop;
import org.aspectj.lang.annotation.Aspect;
@Aspect
public class HelloWorldAspect2 {
 
}

?