zoukankan      html  css  js  c++  java
  • Spring Boot使用注解实现AOP

    第一步: 添加依赖

         <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-aop</artifactId>
            </dependency>

    第二步:定义切面类

    package com.zdst.scs.web.controller.interact.aop;
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.*;
    import org.springframework.stereotype.Component;
    import org.springframework.ui.Model;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    
    /**
     * 这个切面类的功能是给方法的Model添加参数
    * 切点表达式匹配的是两个, 如果只有一个可以去掉 || 及后面的表达式,匹配条件变成一个
    */ @Aspect @Component public class  aop {
      //切点表达式意义自行百度 注意,指定到方法和指定类下所有方法 这两种情况的表达式不同
      //指定到方法: public * com.web.controller.UserController.aop*(..)) UserController类中以aop开头的方法
    // 指定到类: public * com.web.controller.UserController.*.*(..)) UserController类中的所有方法
    @Pointcut(
    "execution(public * com.web.controller.UserController.aop*(..)) || " + "execution(public * com.web.controller.AnotherController.aop*(..))") public void token(){} /** * 添加token */ @Before("token()") public void doBefore(JoinPoint joinPoint){ ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest();//获取request请求 HttpSession session = (HttpSession)request.getSession();//获取session String token=(String)session.getAttribute("token");//获取session存储的属性值 Object[] obj = joinPoint.getArgs();//获取目标方法参数信息 for (Object argItem : obj) { if (argItem instanceof Model) { Model model = (Model) argItem; model.addAttribute("token",token);//设置参数内容 } } } //目标方法执行完后执行 @After("token()") public void doAfter(){ ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); System.out.println(request.getAttributeNames()); }   //获取目标方法返回数据后执行 @AfterReturning(returning = "object",pointcut = "token()") public void doAfterReturn(Object object){ System.out.println(object.toString()); } }

    当调用到切点表达式中的需要被增强的方法时, 就会先进入doBefore方法进行增强

    定义切入点表达式    execution(* com.sample.service.impl..*.*(..))
    其语法如下所示:
    整个表达式可以分为五个部分:
    (1)、execution(): 表达式主体。
    (2)、第一个*号:表示返回类型,*号表示所有的类型。
    (3)、包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包,com.sample.service.impl包、子孙包下所有类的方法。
    (4)、第二个*号:表示类名,*号表示所有的类。
    (5)、*(..):最后这个星号表示方法名,*号表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数。

    想了解更多请自行百度切点表达式

  • 相关阅读:
    DV型、OV型、EV型证书的主要区别
    HTTPS混合内容解析
    Resin 4.0 部署SSL证书
    中间证书的使用
    IBM LOTUS DOMINO 9 部署SSL证书
    F5部署SSL证书
    百度云部署SSL证书
    阿里云部署SSL证书
    加密,解密web.config数据库连接字符串
    不记得oracle管理员密码,更改oracle sys密码的方法
  • 原文地址:https://www.cnblogs.com/gczmn/p/10457349.html
Copyright © 2011-2022 走看看