SpringBoot之AOP使用
说到SpringBoot,难免会想到Spring。
对于Spring,我曾用其开发过很多大大小小的项目。
当使用SpringBoot之后,给人最直观的感受,用古人一句话:”大道至简”。
SpringBoot相比Spring,它的优点其实就是Spring的缺点或不足:
(1)内嵌入Tomcat、Jetty等容器,无需Tomcat就能直接跑起来(这让我想到开发一个庞大的项目,光启动Tomcat就需要花好几分钟);
(2)部署方便,一个可执行的Jar,你可以将其以Docker容器的形式管理部署,也可以使用nohub命令让其持久运行在服务器上;
(3)无需管理一大堆繁重的xml配置(记得初次接触Spring的时候,它给最直观的感受就是将对象交给Spring管理,其实也就是在对应的xml进行配置,不再像很久以前那样自己New之类的,New十几二十个还好,但是一个实际项目,对象太庞大了,如果沿用传统new的方式来管理对象的话,那么将会耗费很多时间精力在这上面,不能很好的集中精力进行业务开发,因为需要考虑对象的初始化以及销毁等),而当我使用SpringBoot以后开发项目,基本上SpringBoot很好的集成第三方库,需要什么就是直接在application.yml或application.properties直接配置即可;
(4)提供的starter-web简化Maven配置(整合常用依赖,相当于将一些web常用jar集成进去,省的我们一个个导入还需要考虑版本兼容性问题);
可以从spring-boot-starter-web依赖传递可以看出,如图:

(5)创建独立的Spring应用(更好的适用于微服务开发);
SpringAOP的应用场景
从实际开发出发,举两个典型例子简单概括一下:
(1)可用于做接口权限控制或者是权限控制;
(2)可用于检测接口请求并统计接口请求次数;
实际上可以从这么几个方面深入挖掘?
(1)日志记录;
(2)性能统计;
(3)安全控制(可以理解为权限控制);
(4)事务处理;
(5)异常处理;
我想每个Java开发者对于这五个方面再了解不过了。
以监听接口请求为例
核心代码如下:
package com.blog.springboot.aop;
import java.util.HashMap;
import java.util.Map;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import cn.hutool.core.lang.Console;
/**
* 系统日志类(用于统计接口请求)
* @author youcong
* @date 2019-09-05
*/
@Aspect
@Component
public class SystemLogAspect { @Pointcut("execution(public * com.blog.springboot.controller..*.*(..))")
public void Pointcut() { Console.log("走你");
} //@Around:环绕通知
@Around("Pointcut()")
public Object Around(ProceedingJoinPoint pjp) throws Throwable {
Map<String,Object> data = new HashMap<>();
//获取目标类名称
String clazzName = pjp.getTarget().getClass().getName();
//获取目标类方法名称
String methodName = pjp.getSignature().getName(); //记录类名称
data.put("clazzName",clazzName);
//记录对应方法名称
data.put("methodName",methodName);
//记录请求参数
data.put("params",pjp.getArgs());
//开始调用时间
// 计时并调用目标函数
long start = System.currentTimeMillis();
Object result = pjp.proceed();
Long time = System.currentTimeMillis() - start; //记录返回参数
data.put("result",result); //设置消耗总时间
data.put("consumeTime",time);
System.out.println(data);
return result; } }
基本上每次请求接口都会获取到对应的接口信息并输出。
如果后台这边需要统计接口请求次数,针对某些接口请求非常频繁,可考虑加缓存或者是进行其它优化等。
SpringAOP之常用注解
简单的说一下AOP,AOP又称面向切面编程,它的常用术语如下:
连接点(Joinpoint)
增强程序执行的某个特定位置(要在哪个地方做增强操作)。SPring仅支持方法的连接点,既仅能在方法调用前,方法调用后,方法抛出异常时等这些程序执行点进行织入增强。
切点(Pointcut)
切点是一组连接点的集合。AOP通过”切点”定位特定的连接点。通过数据库查询的概念来理解切点和连接点的关系再适合不过来:连接点相当于数据库中的记录,而切点相当于查询条件。
增强(Advice)
增强是织入到目标类连接点上的一段程序代码。表示要在连接点上做的操作。
切面(Aspect)
切面由切点和增强(引介)组成(可以包含多个切点和多个增强),它既包括横切逻辑的定义,也包括连接点的定义,SpringAOP就是负责实施切面的框架,它将切面所定义的横切逻辑织入到切面所指定的链接点中。
SpringAOP常用注解如下:
@aspect(定义切面)
@pointcut(定义切点)
@before(标注Before Advice定义所在的方法)
@afterreturning(标注After Returning Advice定义所在的方法)
@afterthrowing(标注After Throwing Advice定义所在的方法)
@after(标注After(Finally)Advice定义所在的方法)
@around(标注Around Advice定义所在的方法)
SpringBoot之AOP使用的更多相关文章
- Springboot的日志管理&Springboot整合Junit测试&Springboot中AOP的使用
==============Springboot的日志管理============= springboot无需引入日志的包,springboot默认已经依赖了slf4j.logback.log4j等日 ...
- SpringBoot学习笔记(七):SpringBoot使用AOP统一处理请求日志、SpringBoot定时任务@Scheduled、SpringBoot异步调用Async、自定义参数
SpringBoot使用AOP统一处理请求日志 这里就提到了我们Spring当中的AOP,也就是面向切面编程,今天我们使用AOP去对我们的所有请求进行一个统一处理.首先在pom.xml中引入我们需要的 ...
- SpringBoot切面Aop的demo简单讲解
前言 本篇文章主要介绍的是SpringBoot切面Aop的demo简单讲解. SpringBoot Aop 说明:如果想直接获取工程那么可以直接跳到底部,通过链接下载工程代码. 切面(Aop) 一.概 ...
- Spring全家桶——SpringBoot之AOP详解
Spring全家桶--SpringBoot之AOP详解 面向方面编程(AOP)通过提供另一种思考程序结构的方式来补充面向对象编程(OOP). OOP中模块化的关键单元是类,而在AOP中,模块化单元是方 ...
- SpringBoot CGLIB AOP解决Spring事务,对象调用自己方法事务失效.
对于像我这种喜欢滥用AOP的程序员,遇到坑也是习惯了,不仅仅是事务,其实只要脱离了Spring容器管理的所有对象,对于SpringAOP的注解都会失效,因为他们不是Spring容器的代理类,Sprin ...
- (办公)springboot配置aop处理请求.
最近项目用到springboot,就是需要配置一些东西.比如用aop处理请求.方法前通知获取url,method,ip,类方法,参数,方法后通知,返回参数,而且还可以记录一下日志.下面是操作的代码. ...
- SpringBoot系列——aop 面向切面
前言 项目中我们经常会用到aop切面,比如日志记录:这里简单记录一下springboot是如何使用aop spring对aop的配置,来自springboot参考手册,Common applicati ...
- SpringBoot使用AOP
本文介绍SpringBoot中使用Spring AOP. 简介 AOP简介 AOP可能对于广大开发者耳熟能详,它是Aspect Oriented Programming的缩写,翻译成中文就是:面向切面 ...
- Spring全家桶系列–SpringBoot之AOP详解
//本文作者:cuifuan //本文将收录到菜单栏:<Spring全家桶>专栏中 面向方面编程(AOP)通过提供另一种思考程序结构的方式来补充面向对象编程(OOP). OOP中模块化的关 ...
- SpringBoot配置Aop笔记【例子】
众所周知,spring最核心的两个功能是aop和ioc,即面向切面,控制反转.这里我们探讨一下如何使用spring aop. 1.何为aop aop全称Aspect Oriented Programm ...
随机推荐
- linux基础命令汇总
目录 linux系统结构 常用命令 切换目录命令cd 文件操作 vi和vim编辑器 重定向输出>和>> 管道 | &&命令执行控制 网络通讯命令 系统管理命令 用户和 ...
- python基础--初始数据结构
目录: 一.知识点1.IDE 集成开发环境2.字符格式化输出3.数据运算4.循环loop5.数据类型6.列表与元组 二.例子1.输入名字.年龄.工作.薪水,进行格式化的输出.2.for语句实现输入密码 ...
- 使用DES算法实现加密解密
使用DES算法实现加密解密 我们常见的加密算法有DES.MD5.IDEA.AES等等,这篇随笔介绍使用DES算法实现加密解密 首先介绍一下DES算法: DES算法为密码体制中的对称密码体制,又被称为美 ...
- 49.react中使用less
1.安装less:npm install less less-loader --save 2.webpack.config.js中配置: oneOf: [ { test: /\.less$/, ...
- HttpUtils请求工具类
package com.cmcc.hybj.payment.framework.https; import java.io.UnsupportedEncodingException;import ja ...
- Golang: 接收GET和POST参数
GET 和 POST 是我们最常用的两种请求方式,今天结合前端 axios 请求库来讲一讲,如何在 golang 服务中,正确接收这两种请求的参数信息. 一.搭建一个简单的服务 首先,我们来创建一个最 ...
- springboot+jndi+tomcat配置多数据源
1.在application.properties中,添加jndi配置,如下图 2.新建dataSourceConfig类 3.dataSourceConfig类详细代码,这里只贴出其中一个,多个数据 ...
- Spring实战(第4版).pdf - 百度云资源
http://www.supan.vip/spring%E5%AE%9E%E6%88%98 Spring实战(第4版).pdf 关于本书 Spring框架是以简化Java EE应用程序的开发为目标而创 ...
- expect免交互用法
一.ssh免交互远程连接linux服务器 ssh在远程连接linux系统时,会有交互,比如输入yes/no,或者需要输入密码.我们怎么避免这些交互呢!比如我们可以用telnet远程登录交换机,去备份交 ...
- js--同步运动json下
这一节针对上一节讲述的bug,我们来处理一下. 这个bug存在的原因就是,一旦只要有一个属性值达到目标值就会清除定时器,所以我们要改变 的就是清除定时器的那么部分.看下面的修改 var timer; ...