天天看点

Spring AOP简单入门学习(二)-常用通知类型

本文主要是对于spring aop简单入门做一些介绍,并不深入了解,只接触表面,对一些较复杂的内容也不过多描述。如文中有错误之处,望不吝赐教,谢谢~

一、AOP常用通知类型

  • 前置通知

    在切入点方法执行之前执行执行的通知。

  • 后置通知

    在切入点方法执行之后执行执行的通知。

  • 异常通知

    在切入点方法执行之后发生异常执行的通知(注意后置通知和异常通知同时只存在一个)。

  • 最终通知

    在切入点方法执行之后执行执行的通知。

    和后置通知不同之处在于,后置通知是在方法正常返回后执行的通知,如果方法没有正常返回,例如抛出异常,则后置通知不会执行。而最终通知无论如何都会在目标方法调用过后执行,即使目标方法没有正常的执行完成。

  • 环绕通知

    在切入点方法执行之前和之后都可以执行额外代码的通知,根据这一特性,可以借助环绕通知实现其他四种通知。

二、实例

在上一篇文章Spring AOP简单入门学习(一)的项目基础上进行展开。

(1)修改Logger.java

package com.example.utils;

public class Logger {

    /**
     * 前置通知
     */
    public void beforePrintLog(){
        System.out.println("打印日志-前置通知");
    }

    /**
     * 后置通知
     */
    public void afterReturningPrintLog(){
        System.out.println("打印日志-后置通知");
    }

    /**
     * 异常通知
     */
    public void afterThrowingPrintLog(){
        System.out.println("打印日志-异常通知");
    }

    /**
     * 最终通知
     */
    public void afterPrintLog(){
        System.out.println("打印日志-最终通知");
    }
}

           

(2)修改bean.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        https://www.springframework.org/schema/aop/spring-aop.xsd">

    <!--配置ioc-->
    <bean id="userService" class="com.example.service.impl.UserServiceImpl"/>
    <bean id="logger" class="com.example.utils.Logger"/>

    <!--配置aop-->
    <aop:config>
        <!--配置切面 id提供唯一标识 ref指定某一bean-->
        <aop:aspect id="logAdvice" ref="logger">
            <!--配置前置通知 -->
            <aop:before method="beforePrintLog"
                        pointcut="execution(* com.example.service.impl.*.*(..))"/>

            <!--配置后置通知 -->
            <aop:after-returning method="afterReturningPrintLog"
                        pointcut="execution(* com.example.service.impl.*.*(..))"/>

            <!--配置异常通知 -->
            <aop:after-throwing method="afterThrowingPrintLog"
                        pointcut="execution(* com.example.service.impl.*.*(..))"/>

            <!--配置最终通知 -->
            <aop:after method="afterPrintLog"
                        pointcut="execution(* com.example.service.impl.*.*(..))"/>

        </aop:aspect>
    </aop:config>



</beans>

           

(3)在saveUser()里面构造一个异常的语句

(4)执行AopTest,结果如下

Spring AOP简单入门学习(二)-常用通知类型

测试成功。注意后置通知和异常通知同时只能有一个执行。

(5)在Logger.java里面添加环绕通知方法

/**
     * 环绕通知
     */
    public Object aroundPrintLog(ProceedingJoinPoint pjp){

        Object returnValue=null;

        try {
            Object[] args=pjp.getArgs();
            System.out.println("打印日志-环绕通知-前置通知");
            returnValue=pjp.proceed(args);
            System.out.println("打印日志-环绕通知-后置通知");
            return returnValue;

        }catch (Throwable throwable) {
            System.out.println("打印日志-环绕通知-异常通知");
            throwable.printStackTrace();
            throw new RuntimeException(throwable);
        }finally {
            System.out.println("打印日志-环绕通知-最终通知");
        }


    }
           

(6)在bean.xml中配置环绕通知

<!--配置环绕通知 -->
            <aop:around method="aroundPrintLog"
                       pointcut="execution(* com.example.service.impl.*.*(..))"/>
           

(7)执行AopTest,结果如下:

Spring AOP简单入门学习(二)-常用通知类型
Spring AOP简单入门学习(二)-常用通知类型

2020.03.21

继续阅读