• 注意这篇文章中写的例子都会用到ioc的知识,因为前面写过一篇关于spring-ioc入门的文章了。ioc和测试的相关jar包参考前面的文章。


    依赖的jar包(aop的):

    1. spring-aop.*.*.*.jar包

    2. aspectj.jar包


    如果不加AspectJ的jar包运行时会报如下错误:


    打开mvnrepository.com搜索aspectj下载

    Spring入门(二)AOP-LMLPHP

    点击搜索结果跳转到介绍及版本概览页,选择一个你想要的版本。

    Spring入门(二)AOP-LMLPHP


    如果你是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源创计划”,欢迎正在阅读的你也加入,一起分享。

    09-10 18:00
    查看更多