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地址

https://gitee.com/zhuayng/foundation-study/blob/develop/SpringBootDemo/src/main/java/com/yxkj/springbootdemo/config/AspectConfig.java

SpringBoot集成AOP的更多相关文章

  1. springboot集成AOP管理日志

    如何将所有的通过url的请求参数以及返回结果都输出到日志中? 如果在controller的类中每个方法名都写一个log输出肯定是不明智的选择. 使用spring的AOP功能即可完成. 1. 在pom. ...

  2. springboot集成aop日志

    日常开发中假如是前后端完全分离,我们会习惯用浏览器去调用controller的接口来测试.这一个过程普通的日志功能会记录sql参数等一些基本信息.但是假如项目越来越庞大,我们的包越来越多,在维护项目和 ...

  3. SpringBoot 源码解析 (十)----- Spring Boot的核心能力 - 集成AOP

    本篇主要集成Sping一个重要功能AOP 我们还是先回顾一下以前Spring中是如何使用AOP的,大家可以看看我这篇文章spring5 源码深度解析----- AOP的使用及AOP自定义标签 Spri ...

  4. SpringBoot 集成Log4j、集成AOP

    集成Log4j (1)在pom.xml中添加依赖 <!--去掉springboot默认的日志--> <dependency> <groupId>org.spring ...

  5. Springboot的日志管理&Springboot整合Junit测试&Springboot中AOP的使用

    ==============Springboot的日志管理============= springboot无需引入日志的包,springboot默认已经依赖了slf4j.logback.log4j等日 ...

  6. springboot集成shiro实现权限认证

    github:https://github.com/peterowang/shiro 基于上一篇:springboot集成shiro实现身份认证 1.加入UserController package ...

  7. SpringBoot集成PageHelper时出现“在系统中发现了多个分页插件,请检查系统配置!”

    近日在项目中使用SpringBoot集成PageHelper后,跑单元测试时出现了"在系统中发现了多个分页插件,请检查系统配置!"这个问题. 如下图所示: org.mybatis. ...

  8. SpringBoot集成Shiro 实现动态加载权限

    一.前言 本文小编将基于 SpringBoot 集成 Shiro 实现动态uri权限,由前端vue在页面配置uri,Java后端动态刷新权限,不用重启项目,以及在页面分配给用户 角色 . 按钮 .ur ...

  9. springBoot 集成Mysql数据库

    springBoot 集成Mysql数据库 前一段时间,我们大体介绍过SpringBoot,想必大家还有依稀的印象.我们先来回顾一下:SpringBoot是目前java世界最流行的一个企业级解决方案框 ...

随机推荐

  1. TCP/IP协议竟然有这么多漏洞

    网络攻击是指利用网络存在的漏洞和安全缺陷对网络系统的软硬件及其系统数据进行攻击的行为.TCP/IP协议作为网络的基础协议,从设计之初并没有考虑到网络将会面临如此多的威胁,导致出现了许多攻击方法.由于网 ...

  2. 【项目管理】《IT项目管理》Kathy Schwalbe 第2章 IT项目管理和IT背景

    1.对项目管理采取系统的观点有何意义?如何在项目管理中采用系统的观点? 意义:有效处理复杂的环境 采用系统方法,系统分析,系统管理.2.解释组织的四个框架.他们是如何帮助项目经理理解项目的组织环境的? ...

  3. 第十一个知识点:DLP,CDH和DDH问题都是什么?

    第十一个知识点:DLP,CDH和DDH问题都是什么 这是第11篇也是数学背景的第二篇.主要关注群操作如何被用于设计密码基础. 就像你现在知道的那样,密码学经常依赖于'难问题'.这也就是说,如果我们假设 ...

  4. Adversarial Self-Supervised Contrastive Learning

    目录 概 主要内容 Linear Part 代码 Kim M., Tack J. & Hwang S. Adversarial Self-Supervised Contrastive Lear ...

  5. PHP json_encode() 序列化对象、数组、空对象、空数组

    $result = [ "object" => ["a" => 1], "array" => [1,2,3,4,5], & ...

  6. python自动化测试框架的unittest与pytest前后置条件的区别

    前言: 笔者先试有用过unittest的前后置条件和pytest的前后置条件,觉得pytest的前后置条件比unittest的要简洁.方便很多.不过在使用unittest的前后置条件时,已经觉得在和每 ...

  7. git 不小心把某个文件给 add 了 的解决方法

    1.我不小心把这两个文件给add 进来本地仓库 2.解决 进入指令框 ,执行 git rm --cached  文件名 如下图 注意,必须指定文件否则会删除所有

  8. Git 基础指令

    Git 基础指令 Git 基础指令 获取 Git 仓库 在已存在目录中初始化仓库 克隆现有的仓库 记录仓库与仓库的更新 仓库的记录 检查当前文件状态 三部曲 跟踪新文件 提交更新 移除文件 推送到远程 ...

  9. 【经验总结】CodeBlocks使用mingw64

    CodeBlocks使用 标签:c++ 一.安装并配置mingw-w64 使用中发现CB默认的编译器版本过低,c++11的一些东西无法使用,比如string中的stoi函数,因此尝试安装新版本的编译器 ...

  10. 【刷题-LeetCode】122 Best Time to Buy and Sell Stock II

    Best Time to Buy and Sell Stock II Say you have an array for which the ith element is the price of a ...