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 ...
随机推荐
- winform中的Windows Media Player播放器设置
namespace WindowsMediaPlayer{ public partial class Form1 : Form { Form2 form2;//声明from2窗体 public For ...
- No module named 'pip._vendor.progress.helpers' 的解决方法
莫名其妙的pip出现故障了 ModuleNotFoundError: No module named ‘pip._vendor.progress.helpers’ 在百度搜索了一圈也没看到这个错误的解 ...
- 015_linuxC++之_覆写
34.类成员函数的重载.覆盖和隐藏区别?答案:a.成员函数被重载的特征:(1)相同的范围(在同一个类中):(2)函数名字相同:(3)参数不同:(4)virtual 关键字可有可无.b.覆盖是指派生类函 ...
- mac使用brew安装的PHP替换自带的PHP
在.zshrc文件后面加上 export PATH="$(brew --prefix homebrew/php/php56)/bin:$PATH"
- mounted里面this.$refs.xxx的内容是undefined
在mounted(){}钩子里面使用this.$refs.xxx,打印出来的却是undefined? DOM结构已经渲染出来了,但是如果在DOM结构中的某个DOM节点使用了v-if.v-show或者v ...
- Contos 安装Tomcat
# 下载安装包 wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.40/bin/apache-tomcat-8. ...
- chattr +i 锁定文件
reboot machine, 查看DNS服务器配置文件\etc\resolv.conf, 里面的内容变回原来的样子. 原因是resolv.conf文件被系统程序自动维护.为了防止该文件被跟改,可以为 ...
- antd源码分析之——标签页(tabs 3.Tabs的滚动效果)
由于ant Tabs组件结构较复杂,共分三部分叙述,本文为目录中第三部分(高亮) 目录 一.组件结构 antd代码结构 rc-ant代码结构 1.组件树状结构 2.Context使用说明 3.rc-t ...
- 初写C#的小总结
虽然大学学过很多计算机语言,但是现在工作是前端,一个刚入行的前端菜鸟,之前对于后台完全零接触,但是最近有个项目,我也是第一次真正接触C#,中间遇到了一些小问题,就做个总结记录下,真的是超级简单的小知识 ...
- Mac系统下,docker安装nextcloud,打造个人本地网盘
1.安装docker 推荐下载地址:http://get.daocloud.io/#install-docker-for-mac-windows 2.拉取镜像 $ docker pull next ...