第一步: 添加依赖

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

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

Spring Boot使用注解实现AOP的更多相关文章

  1. Spring Boot 自定义注解,AOP 切面统一打印出入参请求日志

    其实,小哈在之前就出过一篇关于如何使用 AOP 切面统一打印请求日志的文章,那为什么还要再出一篇呢?没东西写了? 哈哈,当然不是!原因是当时的实现方案还是存在缺陷的,原因如下: 不够灵活,由于是以所有 ...

  2. Spring Boot 常用注解汇总

    一.启动注解 @SpringBootApplication @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documen ...

  3. Spring Boot常用注解总结

    Spring Boot常用注解总结 @RestController和@RequestMapping注解 @RestController注解,它继承自@Controller注解.4.0之前的版本,Spr ...

  4. 3个Spring Boot核心注解,你知道几个?

    Spring Boot 核心注解讲解 Spring Boot 最大的特点是无需 XML 配置文件,能自动扫描包路径装载并注入对象,并能做到根据 classpath 下的 jar 包自动配置. 所以 S ...

  5. Spring Boot@Component注解下的类无法@Autowired的问题

    title: Spring Boot@Component注解下的类无法@Autowired的问题 date: 2019-06-26 08:30:03 categories: Spring Boot t ...

  6. Spring boot 基于注解方式配置datasource

    Spring boot 基于注解方式配置datasource 编辑 ​ Xml配置 我们先来回顾下,使用xml配置数据源. 步骤: 先加载数据库相关配置文件; 配置数据源; 配置sqlSessionF ...

  7. 【SpringBoot】15. Spring Boot核心注解

    Spring Boot核心注解 1 @SpringBootApplication 代表是Spring Boot启动的类 2 @SpringBootConfiguration 通过bean对象来获取配置 ...

  8. spring boot纯注解开发模板

    简介 spring boot纯注解开发模板 创建项目 pom.xml导入所需依赖 点击查看源码 <dependencies> <dependency> <groupId& ...

  9. Spring Boot中注解@ConfigurationProperties

    在Spring Boot中注解@ConfigurationProperties有三种使用场景,而通常情况下我们使用的最多的只是其中的一种场景.本篇文章带大家了解一下三种场景的使用情况. 场景一 使用@ ...

随机推荐

  1. CORS(跨域)请求总结和测试

    一.简单请求与非简单请求 跨域请求分为简单与非简单请求,同时满足以下两种条件的可以确定为简单请求. 简单请求的请求方法 请求方法 说明 head 发送头部信息 get   post   简单请求的HT ...

  2. 『Power Hungry Cows A*启发式搜索』

    Power Hungry Cows(POJ 1945) Description FJ的奶牛想要快速计算整数P的幂 (1 <= P <=20,000),它们需要你的帮助.因为计算极大数的幂, ...

  3. 在越狱的iPhone/iPad上安装自开发环境

    自开发跟自编译意思一样,后者表示一个开发语言的开发能力成熟度:前者则表示一个开发平台的开发能力成熟度. iPhone跟iPad面世这么多年,一直无法摆脱"娱乐"工具的宿命.Appl ...

  4. WinSocket同时接入量的疑惑(求解...)

    在写TCP应用的时候一般都通过Accept来接入连接的接入,但对于Socket来说这个Accept同时能处理多大的量一般都没有明确说明,在应用中主要根据自己的需要设置Listen的队列数量.那List ...

  5. 知识小罐头03(idea+maven+部署war包到tomcat 上)

    自学的的小伙伴第一就要用maven!自学的的小伙伴第一就要用maven!自学的的小伙伴第一就要用maven! 重要的事说三遍!maven本质上,其实就是一种目录的格式,没有什么特别的地方!而且,你可以 ...

  6. ueditor上传图片尺寸过大导致显示难看的解决办法

    昨天遇到这个问题,我也是折腾成了狗, 到处查,最后收集到三个办法,记录一下. 代码贴这里,方便复制 img { max-width: 100%; /*图片自适应宽度*/ } body { overfl ...

  7. 自定义封装ajax,复制即可用

    支持get.post请求 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  8. javascript小实例,拖拽应用(一)

    前面我们将了一下拖拽的基本思想,理论是有了,那实践呢,可以运用到什么地方呢?下面就给大家带来一个用拖拽思想写的一个小实例,供大家参考,大致效果看下图: 就是这样一个简单的一个拖拽条,你可以把它理解为滚 ...

  9. Linux 查找最大文件

    1.使用命令df -h 查看硬盘空间  2.使用命令du -h –max-depth=1 /var/log/* 查看/var/log路径下文件的大小 du -sh /* 查看哪个目录最大,一步一步的查 ...

  10. ArcGIS 网络分析[3] 发布NAServer到ArcGIS for Server(以Server 10.4为例)

    前阵子对ArcGIS API For JavaScript的网络分析有兴趣,但是不知道其数据是如何获取的. 查阅API知道,AJS的网络分析只有三个功能:最短路径(RouteTask).最近设施点(C ...