注意这篇文章中写的例子都会用到ioc的知识,因为前面写过一篇关于spring-ioc入门的文章了。ioc和测试的相关jar包参考前面的文章。
依赖的jar包(aop的):
spring-aop.*.*.*.jar包
aspectj.jar包
如果不加AspectJ的jar包运行时会报如下错误:
打开mvnrepository.com搜索aspectj下载
点击搜索结果跳转到介绍及版本概览页,选择一个你想要的版本。
如果你是maven项目,那么简单,只需要将上图中页面底部的依赖配置项拷贝到pom.xml文件中即可。如果你想下载jar 包,点击表格中的Files行的jar(1.9MB)列即可下载。
既然是讲xml配置方法,那么ioc配置bean的在例子中我也使用xml配置的方式。这里依然使用之前讲解spring ioc时创建的UserDao、UserService这两个接口和它们的实现类UserDaoImpl、UserServiceImpl。
UserDaoImpl类:
UserServiceImpl类:
在applicationContext.xml配置这两个bean
切面类LogAspect,添加一个记录日记的方法(增强/通知,后文有些地方写通知,你只需要知道增强和通知是一个意思就行了)。
配置切面类的bean
接下来就是通过配置xml来实现将切面类的方法(增强)织入到目标对象的连接点了。
首先在applicationContext.xml配置文件中引入aop的名称空间:
所有的切面配置都是放在config标签下面的,即
配置一个切面,切面由切入点和增强组成,配置如下:
解析:
aop:aspect=>配置了一个id为logAspect的切面,ref引入id为logAspectBean的bean。
aop:pointcut=>配置切入点,expression属性配置切入点表达式,这里我匹配了wjy.aop.dao与wjy.aop.service包下的所有类和子包下的所有类的所有方法。
aop:before=>配置增强(通知),需要配置方法名和切入点的引用。
使用spring-test框架简化编写测试类:
运行testAop方法输出如下:
说明已经织入成功了。
为了说明通知的几个配置,需要先将日记切面类修改为如下:
增强(通知)的配置有以下几个:
before:前置通知,是在匹配的方法执行之前织入,也叫前置通知;
after:后置通知,是在匹配的方法执行之后织入,也叫后置通知;
around:环绕通知,可以实现在匹配方法执行之前和之后通知;
after-throwing:后置异常通知,也叫异常通知,因为只有目标方法执行了才可能抛出异常,所以只有后置异常通知;
after-returning:后置返回通知,即返回通知,可以获取到目标方法的返回值;
附例子完整配置:
修改applicationContext.xml配置文件,去掉bean的配置和aop的配置,使用<aop:aspectj-autoproxy>标签开启aop注解功能。
需要将切面类注解为bean,且还要注解为切面。
接着就是使用注解配置通知了,对应五种通知的注解分别为:
@Before:注解该方法为前置通知,@Before("切入点表达式");
@After:注解该方法为后置通知,@After("切入点表达式");
@Around:注解该方法为环绕通知,@Around("切入点表达式");
@AfterReturning:注解为运行返回通知,@AfterReturning(value="切入点表达式",returning="接收返回值的参数名");
@AfterThrowing:注解为运行返回通知,@AfterThrowing(value="切入点表达式",throwing="接收异常的参数名");
使用注解后的LogAspect切面类(使用环绕通知时去掉前置通知和后置通知):
由于同一个切面对于不同的通知类型我们只需要同一个切入点,所以LogAspect切面类可以改为这样:
之前讲ioc那篇文章已经讲过spring零配置的方式了,这里只需要在ioc的零配置基础上添加aop的支持就可以了。
SpringConfig类:
启用aop注解只需要在SpringConfig类加上@EnableAspectJAutoProxy注解即可。
测试类只需要将@ContextConfiguration注解的
locations = "classpath:applicationContext.xml"
改为
@ContextConfiguration(classes = wjy.aop.SpringConfig.class)
这跟前面讲ioc零配置是一样的,也就是说唯一不一样的就是在spring配置类加个@EnableAspectJAutoProxy注解开启aop注解功能而已。
本文分享自微信公众号 - Java艺术(javaskill)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。