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)、*(..):最后这个星号表示方法名,*号表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数。

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

  • 相关阅读:
    积水路面Wet Road Materials 2.3
    门控时钟问题
    饮料机问题
    Codeforces Round #340 (Div. 2) E. XOR and Favorite Number (莫队)
    Educational Codeforces Round 82 (Rated for Div. 2)部分题解
    Educational Codeforces Round 86 (Rated for Div. 2)部分题解
    Grakn Forces 2020部分题解
    2020 年百度之星·程序设计大赛
    POJ Nearest Common Ancestors (RMQ+树上dfs序求LCA)
    算法竞赛进阶指南 聚会 (LCA)
  • 原文地址:https://www.cnblogs.com/gczmn/p/10457349.html
Copyright © 2011-2022 走看看