SpringBoot中使用aop-测试
面向切面编程(AOP),该种方式主要是为了弥补面向对象编程(OOP)的不足,通过配置切面以及关注点、通知等我们可以在程序的任意位置对我们的代码进行增强(执行一些代码),AOP是Spring的特性之一,通常我们使用AOP来实现日志的补记录以及实现一些声明式的事务等。
接下来,通过一个简单的例子来测试一下AOP如何使用:
1、pom.xml文件的依赖如下
<dependencies>
<!--1.单元测试的依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--2.aop的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!--3.cglib动态代理的依赖-->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.2.5</version>
</dependency>
<!--4.web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--5.小辣椒-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
2、application.yml(springboot)的配置文件内容如下:

其中,server.port代表端口号(tomcat的端口号)
其他内容为自定义的内容,可通过@Value注解获取到内容值
${name}为使用表达式获取当前yml文件中对应的name的值
3、定义用于返回的类(使用RestController,返回json数据),代码如下:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result {
private boolean success;
private String msg;
}
4、定义自己的Service类(模拟业务场景),代码如下:
@Service
public class JieService { public void todo(){
System.out.println("这是一个Service方法的调用!");
}
}
@Service :把该类注入Spring容器中,若需要使用,则通过@Autowired 注解获取
5、定义一个Controller类(控制类,模拟处理用户的请求),代码如下:
@RestController
public class JieController {
@Autowired
private JieService jieService;
// 使用yml配置文件中的参数
@Value("${content}")
public String content; @RequestMapping("/hello")
public Result hello(){
jieService.todo();
return new Result(true,content);
}
}
其中,@Autowired 注解则获取到Spring容器中我们通过@Service 注解注入的对象
@RestController 注解为标记返回的数据为json格式
@Value 注解则获取到application.yml 文件中对应的参数名的值,这里@Value(${content})的写法跟在yml中去到定义的值一样
6、配置一个切面类,且注入Spring容器中,通过@Aspect 标记为切面类、@Component 注入Spring容器中,并且添加一些测试方法,代码如下:
@Component // 注册到spring容器中
@Aspect // 标志为切面类
public class ServiceAdvice {
/**
* 解读:
* execution为固定写法
* public * com.jieku.service..*.*(..)
* 第一个 * 表示所有的返回参数
* 之后代表切入点的包名,其后跟着两个点(.)表示当前包及其所有的子包
* 两个点后的* 代表所有的类 =》 综合两个点加上* ..* 表示当前包及其所有子包的所有类
* 之后的点个人理解为调用方法,点后的*表示所有的方法,之后括号中的两个点.表示任意的参数个数
* 总的解答:拦截com.jieku.service的当前包及其子包中的所有类(任意的返回参数类型)的所有方法的调用(任意参数列表)
*/
@Pointcut("execution(public * com.jieku.service..*.*(..))")
public void good(){} @Before("good()")
public void before(){
System.out.println("之前拦截到了,并且执行了!");
} @After("good()")
public void after(){
System.out.println("之后也拦截到了,并且执行了!");
} /**
* @Ponitcut:表示切入点,理解为找到需要增强的方法执行我们定义的增强的代码
* 通知:
* @Before:前置通知,方法执行前执行该通知
* @After:后置通知,方法执行完成之后执行该通知
* @Around:环绕通知
* @AfterReturning:在返回之后执行该通知
* @AfterThrowing:在抛出异常后执行该通知
*/
}
7、执行效果如下:
在页面上输入:localhost:8080/hello,执行效果如下:

8、补充:启动类以及项目结构图
启动类代码如下:
@SpringBootApplication
public class JieApplication {
public static void main(String[] args) {
SpringApplication.run(JieApplication.class);
}
}
项目结构图如下:

9、后台的运行结果:

至此,简单测试成功!
SpringBoot中使用aop-测试的更多相关文章
- SpringBoot图文教程5—SpringBoot 中使用Aop
有天上飞的概念,就要有落地的实现 概念+代码实现是本文的特点,教程将涵盖完整的图文教程,代码案例 文章结尾配套自测面试题,学完技术自我测试更扎实 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例 ...
- Springboot中使用AOP统一处理Web请求日志
title: Springboot中使用AOP统一处理Web请求日志 date: 2017-04-26 16:30:48 tags: ['Spring Boot','AOP'] categories: ...
- 在SpringBoot中配置aop
前言 aop作为spring的一个强大的功能经常被使用,aop的应用场景有很多,但是实际的应用还是需要根据实际的业务来进行实现.这里就以打印日志作为例子,在SpringBoot中配置aop 已经加入我 ...
- 编写SpringBoot 中的AOP
编写SpringBoot 中的AOP 在程序开发的过程中会使用到AOP的思想,面向切面进行开发,比如登录的验证,记录日志等等-频繁需要操作的步骤,在遇到这种情况时就要使用Spring 的AOP了 Sp ...
- SpringBoot中使用AOP打印接口日志的方法(转载)
前言 AOP 是 Aspect Oriented Program (面向切面)的编程的缩写.他是和面向对象编程相对的一个概念.在面向对象的编程中,我们倾向于采用封装.继承.多态等概念,将一个个的功能在 ...
- springboot中使用aop技术
aop是面向切面编程的意思,它可以需要先选择一些切入点,然后对这些切入点进行拦截,注入统一的代码逻辑,这也是解耦的一种方式,也是为了避免重复的代码,让开发人员把关注点放在业务上. 引用包 'org.s ...
- SpringBoot中使用 RabbitMQ -测试
本章主要建立在已经安装好Erlang以及RabbitMQ的基础上,接下来,简单介绍一下使用 1.首先到RabbitMQ的管理界面新建一个队列(Direct模式) 2.测试项目的基础结构如下: 这里为了 ...
- 在SpringBoot中使用Junit测试
一:加入依赖 <dependency> <groupId>junit</groupId> <artifactId>junit</artifactI ...
- spring-boot中的AOP
public class User { private Integer id; private String username; private String note; public User(In ...
- SpringBoot中使用AOP实现计算Service执行时间
1.增加POM.XML的依赖架包 <!-- 引入 spring aop 依赖 --><dependency> <groupId>org.springframewor ...
随机推荐
- Laravel中Contracts的理解和使用
Laravel 的 Contracts 是一组定义了框架核心服务的接口.说白了就是一组接口.使用它就是为了降低耦合性. 即便如此,是不是也有同学会搞不清楚Contracts在lavarel体系中的到底 ...
- B/S架构大文件上传问题
核心原理: 该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开 ...
- TTTTTTTTTTTT Gym 100818B Tree of Almost Clean Money 树连剖分+BIT 模板题
Problem B Tree of Almost Clean Money Input File: B.in Output File: standard output Time Limit: 4 sec ...
- Ubuntu 出现 Invalid operation update 或 Invalid operation upgrade的解决办法
输入 sudo apt update && sudo apt full-upgrade
- 解决xftp远程连接后出现中文乱码
- Makefile规则介绍
Makefile 一个规则 三要素:目标,依赖,命令 目标:依赖 命令 1.第一条规则是用来生成终极目标的规则 如果规则中的依赖不存在,向下寻找其他的规则 更新机制:比较的是目标文件和 ...
- 在windows下安装lxml 报错error: Unable to find vcvarsall.bat
刚开始安装 ,我是使用命令pip install lxml直接进行安装,不过出错了 error: Unable to find vcvarsall.bat 解决方案: 1.首先安装wheel,pip ...
- javascript实现集合Set、字典Dictionary、HashTable
集合是由一组无序且唯一(即不能重复)的项组成的.这个数据结构使用了与有限集合相同的数学概念,但应用在计算机科学的数据结构中. function Set() { this.items = {}; } S ...
- arcgis python RefreshActiveView CLEAR_SELECTION
import arcpy mxd = arcpy.mapping.MapDocument("CURRENT") df = arcpy.mapping.ListDataFrames( ...
- 修改vscode终端样式
在设置中查找workbench,然后编辑setting.json: "terminal.integrated.cursorBlinking": true, "termin ...