SpringBoot集成AOP
AOP简介
面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术,AOP是OOP的延续。简单的说它就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理技术,在不修改源码的基础上,对我们已有的方法进行增强。
相关概念
Joinpoint(连接点)
所谓连接点是指那些被拦截到的点。在 spring 中,这些点指的是方法,因为 spring 只支持方法类型的连接点。
Pointcut(切入点)
所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义。
Advice(通知/增强)
所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知。
通知的类型:前置通知,后置通知,异常通知,最终通知,环绕通知。
Introduction(引介)
引介是一种特殊的通知在不修改类代码的前提下, Introduction 可以在运行期为类动态地添加一些方法或 Field。
Target(目标对象)
代理的目标对象。
Weaving(织入)
是指把增强应用到目标对象来创建新的代理对象的过程。
Proxy(代理)
一个类被 AOP 织入增强后,就产生一个结果代理类。
Aspect(切面)
是切入点和通知(引介)的结合。
在spring 中,框架会根据目标类是否实现了接口来决定采用哪种动态代理的方式。
在spring 中,2.0默认采用CGLIB代理,如果需要基于接口的动态代理(JDK基于接口的动态代理) ,需要设置spring.aop.proxy-target-class属性为false。
spring的动态代理,借用了AspectJ的注解。
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
Controller层编写
@Controller
@RequestMapping("aspect")
@Api(tags = "切面")
public class AspectController {
@ApiOperation("切面通知")
@RequestMapping(value = "/sayHello",method = RequestMethod.GET)
@ResponseBody
public Object sayHello(String name){
System.out.println("---------------------方法执行----------------");
return "hello " + name;
}
}
切面类编写
@Aspect //表示当前类是一个切面类
@Component
@Slf4j
public class AspectConfig {
/**
* 定义切入点,切入点为com.yxkj.springbootdemo.controller下的所有函数
*
**/
@Pointcut("execution(public * com.yxkj.springbootdemo.controller..*.*(..))")
public void root(){}
//当前方法是异常通知
@AfterThrowing("root()")
public void rollback() {
log.info("当前方法是一个异常通知");
}
//当前方法是最终通知
@After("root()")
public void release() {
log.info("当前方法是一个最终通知");
}
//环绕通知
@Around("root()")
public Object transactionAround(ProceedingJoinPoint pjp) throws Throwable {
//定义返回值
Object rtValue = null;
//获取方法执行所需的参数
Object[] args = pjp.getArgs();
log.info("环绕通知执行方法前,传入参数"+args[0]);
//执行方法
rtValue = pjp.proceed(args);
log.info("环绕通知执行方法后,传出参数"+rtValue);
return rtValue;
}
@Before("root()")
public void doBefore(JoinPoint joinPoint) throws Throwable {
// 接收到请求,记录请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 记录下请求内容
log.info("前置通知:URL : " + request.getRequestURL().toString());
log.info("前置通知:HTTP_METHOD : " + request.getMethod());
log.info("前置通知:IP : " + request.getRemoteAddr());
log.info("前置通知:CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
log.info("前置通知:传入参数 : " + Arrays.toString(joinPoint.getArgs()));
}
@AfterReturning(returning = "ret", pointcut = "root()")
public void doAfterReturning(Object ret) throws Throwable {
// 处理完请求,返回内容
log.info("后置通知:返回参数 : " + ret);
}
}
访问方法结果
13 08:50:25.453 INFO ||:环绕通知执行方法前,传入参数123213
13 08:50:25.454 INFO ||:前置通知:URL : http://127.0.0.1:8088/springbootdemo/aspect/sayHello
13 08:50:25.454 INFO ||:前置通知:HTTP_METHOD : GET
13 08:50:25.454 INFO ||:前置通知:IP : 127.0.0.1
13 08:50:25.455 INFO ||:前置通知:CLASS_METHOD : com.yxkj.springbootdemo.controller.AspectController.sayHello
13 08:50:25.455 INFO ||:前置通知:传入参数 : [123213]
---------------------方法执行----------------
13 08:50:25.457 INFO ||:后置通知:返回参数 : hello 123213
13 08:50:25.457 INFO ||:当前方法是一个最终通知
13 08:50:25.457 INFO ||:环绕通知执行方法后,传出参数hello 123213
Gitee地址
SpringBoot集成AOP的更多相关文章
- springboot集成AOP管理日志
如何将所有的通过url的请求参数以及返回结果都输出到日志中? 如果在controller的类中每个方法名都写一个log输出肯定是不明智的选择. 使用spring的AOP功能即可完成. 1. 在pom. ...
- springboot集成aop日志
日常开发中假如是前后端完全分离,我们会习惯用浏览器去调用controller的接口来测试.这一个过程普通的日志功能会记录sql参数等一些基本信息.但是假如项目越来越庞大,我们的包越来越多,在维护项目和 ...
- SpringBoot 源码解析 (十)----- Spring Boot的核心能力 - 集成AOP
本篇主要集成Sping一个重要功能AOP 我们还是先回顾一下以前Spring中是如何使用AOP的,大家可以看看我这篇文章spring5 源码深度解析----- AOP的使用及AOP自定义标签 Spri ...
- SpringBoot 集成Log4j、集成AOP
集成Log4j (1)在pom.xml中添加依赖 <!--去掉springboot默认的日志--> <dependency> <groupId>org.spring ...
- Springboot的日志管理&Springboot整合Junit测试&Springboot中AOP的使用
==============Springboot的日志管理============= springboot无需引入日志的包,springboot默认已经依赖了slf4j.logback.log4j等日 ...
- springboot集成shiro实现权限认证
github:https://github.com/peterowang/shiro 基于上一篇:springboot集成shiro实现身份认证 1.加入UserController package ...
- SpringBoot集成PageHelper时出现“在系统中发现了多个分页插件,请检查系统配置!”
近日在项目中使用SpringBoot集成PageHelper后,跑单元测试时出现了"在系统中发现了多个分页插件,请检查系统配置!"这个问题. 如下图所示: org.mybatis. ...
- SpringBoot集成Shiro 实现动态加载权限
一.前言 本文小编将基于 SpringBoot 集成 Shiro 实现动态uri权限,由前端vue在页面配置uri,Java后端动态刷新权限,不用重启项目,以及在页面分配给用户 角色 . 按钮 .ur ...
- springBoot 集成Mysql数据库
springBoot 集成Mysql数据库 前一段时间,我们大体介绍过SpringBoot,想必大家还有依稀的印象.我们先来回顾一下:SpringBoot是目前java世界最流行的一个企业级解决方案框 ...
随机推荐
- Causal Inference
目录 Standardization 非参数情况 Censoring 参数模型 Time-varying 静态 IP weighting 无参数 Censoring 参数模型 censoring 条件 ...
- spring练习,使用Eclipse搭建的Spring开发环境,属性注入通过构造方法方式实现,模拟用户的正常登录。
相关 知识 >>> 相关 练习 >>> 实现要求: 使用Eclipse搭建的Spring开发环境,属性注入通过构造方法方式实现,模拟用户的正常登录.要求如下: 通过 ...
- MyBatis 一级缓存实现详解及使用注意事项
一级缓存介绍 在应用运行过程中,我们有可能在一次数据库会话中,执行多次查询条件完全相同的SQL,MyBatis提供了一级缓存的方案优化这部分场景,如果是相同的SQL语句,会优先命中一级缓存,避免直接对 ...
- VUE3 之 键盘事件
1. 概述 老话说的好:宁愿自己吃亏,也不让他人吃亏. 言归正传,今天我们来聊聊 VUE3 的 键盘事件. 2. 键盘事件 2.1 敲击任意键触发事件 <body> <div id= ...
- 779. 第K个语法符号
<找规律> <递归> 题目描述 在第一行我们写上一个 0.接下来的每一行,将前一行中的0替换为01,1替换为10. 给定行数 N 和序数 K,返回第 N 行中第 K个字符.(K ...
- @RestController和@Controller的关系
@RestController注解,相当于@Controller+@ResponseBody两个注解的结合
- Python常用功能函数系列总结(五)
本节目录 常用函数一:向量距离和相似度计算 常用函数二:pagerank 常用函数三:TF-IDF 常用函数四:关键词提取 常用函数一:向量距离和相似度计算 KL距离.JS距离.余弦距离 # -*- ...
- element ui table 表格排序
实现elementui表格的排序 1:给table加上sort-change,给table每一项加上sortable和column-key,排序是根据column-key来进行排序的 <el-t ...
- 一个小程序:Instrumentation的使用
本来是想练习Matrix的,没想到写了一个自定义View,监听它的ASWD键后,不知道该如何按下ASWD(手机上一般都没实体按键了).于是: 一个自定义View: public class MyVie ...
- Javascript实现让小图片一直跟着鼠标移动
Javascript实现让小图片一直跟着鼠标移动实例 注意:图片可能加载不出来,注意更换 <!doctype html> <html> <head> <met ...