欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

spring项目中切面及AOP的使用方法

程序员文章站 2022-06-19 07:55:16
使用aop的原因(aop简介)我们知道,spring两大核心,ioc(控制反转)和aop(切面),那为什么要使用aop,aop是什么呢,严格来说,aop是一种编程规范,是一种编程思想,并非spring...

使用aop的原因(aop简介)

我们知道,spring两大核心,ioc(控制反转)和aop(切面),那为什么要使用aop,aop是什么呢,严格来说,aop是一种编程规范,是一种编程思想,并非spring创造,aop可以帮助我们在一定程度上从冗余的通用的业务逻辑中解脱出来,最明显的,比如每个接口的请求,都要记录日志,那这个操作如果每个地方都写,就会很繁琐,当然,记录日志并不是唯一的用法

spring的aop只能基于ioc来管理,它只能作用于spring容器的bean

并且,spring的aop为的是解决企业开发中出现最普遍的方法织入,并不是为了像aspectj那样,成为一个完全的aop使用解决方案

aop的使用

开启aop支持

要使用aop,首先要开启aop的支持

<dependency>
   <groupid>org.springframework.boot</groupid>
   <artifactid>spring-boot-starter-aop</artifactid>
</dependency>

启动类添加 @enableaspectjautoproxy 注解

编写切面类与测试方法

@aspect
@component
public class myaop {
 
}
@restcontroller
public class onecontroller {
 
    @getmapping("/docheck")
    public string docheck (int age) {
        system.out.println("docheck");
        if (age > 1) {
        throw new myexception(exceptionenu.success);
        } else {
            throw new myexception(exceptionenu.faild);
        }
    }
 
}

记得切面类交给spring管理哦~ @component

编写切面方法

@before

这个注解的用法呢,就是说,在执行你要执行的东西之前,执行加了这个注解的方法

比如

 @before(value = "execution (* own.study.web.onecontroller.*(..))")
    public void doaop( ) {
        system.out.println("before aop");
    }

也就是说,如果我要调用 onecontroller 的方法,在调用到之前,会执行这个 doaop 方法

让我们来测试一下

spring项目中切面及AOP的使用方法

@after

这个注解的用法,就是说,当你执行完你的方法之后,真的返回给调用方之前,执行加了这个注解的方法

比如

@after(value = "execution (* own.study.web.onecontroller.*(..))")
    public void doafter() {
        system.out.println("after aop");
    }

让我们来测试一下

spring项目中切面及AOP的使用方法

@afterthrowing

见名知意,在发生异常后,执行加了此注解的方法

注意我上面写的测试方法了吗?我抛出了自定义的异常

让我们测试一下

spring项目中切面及AOP的使用方法

@afterreturning

这个注解的用法也是看名字就能猜到,执行完后,执行此方法

但是!这个执行完,指的是正常执行完,不抛出异常的那种,不信?我们来试试

spring项目中切面及AOP的使用方法

@around

这个是最为强大的一个注解,环绕通知,方法执行前和执行后都会执行加了这个注解的方法

@around(value = "execution (* own.study.web.onecontroller.*(..))")
    public object doaround (proceedingjoinpoint point) throws throwable {
        gson gson = new gson();
        system.out.println("进入aop --->" + system.currenttimemillis());
        system.out.println("方法名 = " + point.getsignature().toshortstring());
 
        object result = point.proceed();
 
        system.out.println("响应参数为 = " + gson.tojson(result));
        system.out.println("aop完事了 --->" + system.currenttimemillis());
        return result;
    }
@restcontroller
public class onecontroller {
 
    @getmapping("/docheck")
    public object docheck (int age) throws interruptedexception {
        system.out.println("这个是controller的方法 --->" + system.currenttimemillis());
        thread.sleep(2000l);
        system.out.println("docheck");
 
       return new myrsp("1", "success");
    }
 
}

spring项目中切面及AOP的使用方法

但是,注意!这个环绕通知不是万能的,不是一定好,大家按需要使用,比如一个场景,当你的方法抛出了异常,这个环绕通知就不会再继续执行

我们来实验一下

改写controller的方法

@restcontroller
public class onecontroller {
 
    @getmapping("/docheck")
    public object docheck (int age) throws interruptedexception {
        system.out.println("这个是controller的方法 --->" + system.currenttimemillis());
        thread.sleep(2000l);
        system.out.println("docheck");
        throw new myexception("1", "success");
 
//       return new myrsp("1", "success");
    }
 
}

spring项目中切面及AOP的使用方法

看,aop后续的没有被执行

以上就是spring的切面,aop的使用的详细内容,更多关于spring的切面,aop的使用的资料请关注其它相关文章!

相关标签: spring 切面 AOP