您的位置:首页 > 编程语言 > ASP

Spring集成AspectJ的注解模式

2016-03-05 16:54 731 查看
过去曾经记录过基础的Spring AOP:http://blog.csdn.net/sadfishsc/article/details/8875110

不过在实际工作中,这种非常早期的AOP写法由于比较繁琐,使用得并不多。大多数情况下使用的是spring集成aspectj提供的注解模式的AOP

如下是一个简单的例子:

1. Maven依赖

<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.5</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.5</version>
</dependency>

2. spring配置

由于是注解模型,因此在spring的配置文件中需要的配置其实很少,主要有二:component-scan 和 aspectj-autoproxy:

<context:component-scan base-package="..." />
<aop:aspectj-autoproxy proxy-target-class="true" />

3. 添加注解

@Aspect
@Component
public class MyAspect {

@Pointcut("execution(* cn.hibrant.liu.Test.run(..))")
public void pointcut() {
}

@AfterReturning(value = "pointcut()", returning = "result")
public void after(JoinPoint jp, JSONObject result) throws Exception {
...
}

@AfterThrowing(value = "pointcut()", throwing = "exception")
public void afterThrowingException(JoinPoint jp, Exception exception) {
...
}
}

注解模式的aspectj中,切面逻辑、切入点等都需要集中定义在一个类中。其中:

@Pointcut注解定义了切入点,它通过一个execution表达式来指定需要切入的类和方法,将本注解所在的方法与切入的方法绑定,后续的操作中都直接使用注解所在方法的方法名来映射被切入的方法(因而本方法只需为空即可)。pointcut可定义多个
Aspectj提供了多种类型的切面逻辑:主要有@After(方法结束)、@AfterReturning(方法返回)、@AfterThrowing(方法抛出异常)、@Before(方法开始前)、@Around(方法前后)这五个针对方法的注入,以及其它一些针对变量声明的注入(不常用)
从注解的参数列表中可以看出该注解所对应的切面逻辑能提供什么样的参数,如:@AfterReturning的returning参数,可以指定目标方法的返回值在本切面逻辑中的变量名;@AfterThrowing的throwing参数,可以指定目标方法抛出的异常对象在本切面逻辑中的变量名。除此而外,所有的切面注解都必有两个参数:value和argNames,value用于指定pointcut的方法名,argNames则是目标方法各参数在本切面逻辑中的方法名
切面方法自带一个参数叫JoinPoint,其中保存了方法的一些元数据信息,最有用的便是可以从中直接获取参数对象列表,以及可以直接获取到作为注入点的目标对象
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: