美文网首页Miners-ICU
Spring boot 使用Aop

Spring boot 使用Aop

作者: Sober_清醒 | 来源:发表于2020-01-10 10:47 被阅读0次
    • AOP及自定义注解使用

    • Aop即为切面编程,通常以下几个场景回使用到:

      • 事务

      • 拦截

      • 日志

      • 等等

    • 废话不多说既然是Spring boot 那我们当然是使用Spring aop

    使用方法

    • 先介绍一下AOP的常用注解
    注解 解释
    @Pointcut 通常使用为@Pointcut("execution(* XXXXX.*.*(..))")可以匹配连接点,及定位要切入的地方在哪里。
    @Before 增强处理,表示在切入点执行前需要进行的操作或者需要执行的方法
    @After 表示在切入点执行后,进行哪些操作
    @AfterReturning pointcut/value:用于指定该切入点对应的切入表达式,returning:该属性值指定一个形参名,用于表示Advuce方法中可以定义与此同名的形参,该形参可用于访问目标方法的返回值
    @AfterThrowing 同上,throwing,返回异常
    @Around 增强相当于以上几种总和,很强大但最好线程安全使用
    @DeclareParents value:指向你要增强功能的目标对象,这里要增强UserServiceImpl对象,defaultImpl:引入增强功能的类,这里配置为UserValidatorImpl,用来提供校验用户是否为空的功能

    开始实际使用

    • 注入pom
    <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-aop</artifactId>
     <version>2.2.2.RELEASE</version>
     </dependency>
    
    • 先写切面类
    @Component
    @Aspect
    public class Aoptest {
        @Pointcut("execution(* com.example.zj.contorller.*.*(..))")
        public void pc1(){}
    
        @Before(value = "pc1()")
        public void before(JoinPoint jp){
            String name = jp.getSignature().getName();
            System.out.println(name+"方法开始执行");
        }
    
        @After(value = "pc1()")
        public void after(JoinPoint jp){
            String name = jp.getSignature().getName();
            System.out.println(name+"方法执行结束");
        }
    
        @AfterReturning(value = "pc1()",returning = "result")
        public void afterReturning(JoinPoint jp,Object result){
            String name = jp.getSignature().getName();
            System.out.println(name+"方法返回值为"+result);
        }
    
        @AfterThrowing(value = "pc1()",throwing = "e")
        public void afterThrowing(JoinPoint jp,Exception e){
            String name = jp.getSignature().getName();
            System.out.println(name+"方法抛出异常"+e.getMessage());
        }
    
        @Around("pc1()")
        public Object around(ProceedingJoinPoint pjp)throws Throwable{
            System.out.println("方法环绕先");
            try {
                Object o =  pjp.proceed();
                System.out.println("方法环绕后,结果是 :" + o);
                return o;
            } catch (Throwable e) {
                e.printStackTrace();
                return null;
            }
        }
    }
    
    • controller类
    @RestController
    public class test {
        @GetMapping("test1")
        public JsonResult test1(){
            return new JsonResult(200,"sucess","111");
        }
    
    
        @GetMapping("test2")
        public JsonResult test2(String name){
            if(name.length() < 3 || name.length() > 10)
            {
                throw new IllegalArgumentException("name参数的长度必须大于3,小于10!");
            }
            return new JsonResult(200,"sucess","222");
        }
    }
    
    • 运行项目,请求controller中定义的url,结果为:
    方法环绕先
    test1方法开始执行
    方法环绕后,结果是 :JsonResult(code=200, msg=sucess, result=111)
    test1方法执行结束
    test1方法返回值为JsonResult(code=200, msg=sucess, result=111)
    
    • 可以自行请求controller中定义的test2并抛出异常,观察两者执行顺序变化

    • 最后讲一下代码中的execution(* com.example.zj.contorller..*.*(..)):

      • 第一个*表示返回类型,*即为所有类型

      • 随后跟着包名..及表示当前包及所有子包

      • 之后的*表示类名,*即所有类

      • 在之后的*即为方法

      • (..)表示方法参数..及表示任何参数

    相关文章

      网友评论

        本文标题:Spring boot 使用Aop

        本文链接:https://www.haomeiwen.com/subject/gnvuactx.html