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

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

猜你喜欢

转载自www.cnblogs.com/gczmn/p/10457349.html