面向切面编程(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-测试的更多相关文章

  1. SpringBoot图文教程5—SpringBoot 中使用Aop

    有天上飞的概念,就要有落地的实现 概念+代码实现是本文的特点,教程将涵盖完整的图文教程,代码案例 文章结尾配套自测面试题,学完技术自我测试更扎实 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例 ...

  2. Springboot中使用AOP统一处理Web请求日志

    title: Springboot中使用AOP统一处理Web请求日志 date: 2017-04-26 16:30:48 tags: ['Spring Boot','AOP'] categories: ...

  3. 在SpringBoot中配置aop

    前言 aop作为spring的一个强大的功能经常被使用,aop的应用场景有很多,但是实际的应用还是需要根据实际的业务来进行实现.这里就以打印日志作为例子,在SpringBoot中配置aop 已经加入我 ...

  4. 编写SpringBoot 中的AOP

    编写SpringBoot 中的AOP 在程序开发的过程中会使用到AOP的思想,面向切面进行开发,比如登录的验证,记录日志等等-频繁需要操作的步骤,在遇到这种情况时就要使用Spring 的AOP了 Sp ...

  5. SpringBoot中使用AOP打印接口日志的方法(转载)

    前言 AOP 是 Aspect Oriented Program (面向切面)的编程的缩写.他是和面向对象编程相对的一个概念.在面向对象的编程中,我们倾向于采用封装.继承.多态等概念,将一个个的功能在 ...

  6. springboot中使用aop技术

    aop是面向切面编程的意思,它可以需要先选择一些切入点,然后对这些切入点进行拦截,注入统一的代码逻辑,这也是解耦的一种方式,也是为了避免重复的代码,让开发人员把关注点放在业务上. 引用包 'org.s ...

  7. SpringBoot中使用 RabbitMQ -测试

    本章主要建立在已经安装好Erlang以及RabbitMQ的基础上,接下来,简单介绍一下使用 1.首先到RabbitMQ的管理界面新建一个队列(Direct模式) 2.测试项目的基础结构如下: 这里为了 ...

  8. 在SpringBoot中使用Junit测试

    一:加入依赖 <dependency> <groupId>junit</groupId> <artifactId>junit</artifactI ...

  9. spring-boot中的AOP

    public class User { private Integer id; private String username; private String note; public User(In ...

  10. SpringBoot中使用AOP实现计算Service执行时间

    1.增加POM.XML的依赖架包 <!-- 引入 spring aop 依赖 --><dependency> <groupId>org.springframewor ...

随机推荐

  1. CodeForces 834C - The Meaningless Game | Codeforces Round #426 (Div. 2)

    /* CodeForces 834C - The Meaningless Game [ 分析,数学 ] | Codeforces Round #426 (Div. 2) 题意: 一对数字 a,b 能不 ...

  2. javascript---查找节点

    快捷键: chazhaojiedian(查找节点)     chuangjianjiedian(创建节点) 使用childNodes childElementCount//=====以下是第一种操作D ...

  3. Python2.x与3​​.x版本区别Ⅲ

    八进制字面量表示 八进制数必须写成0o777,原来的形式0777不能用了:二进制必须写成0b111. 新增了一个bin()函数用于将一个整https://www.xuanhe.net/数转换成二进制字 ...

  4. 了解Springboot加载文件机制

    https://blog.csdn.net/u014044812/article/details/84256764(

  5. 丰桥运单打印windows/linux环境安装(原)

    Linux ①linux下安装jdk1.8,执行命令:yum -y install java ②创建文件夹sf-service将csim_waybill_print_service_V1.0.3.ja ...

  6. [JZOJ6346]:ZYB和售货机(拓扑+基环内向森林)

    题目描述 可爱的$ZYB$来到一个售货机前. 售货机里有一共有$N(\leqslant 10^5)$个物品,每个物品有$A_i$个.自然,还有$N$个购买按钮.正常情况下,按下第$i$个按钮,需要支付 ...

  7. 搬运 centos7.2 apache 绑定二级目录 访问依然是apache页面

    <VirtualHost *:80>ServerName xx.comDocumentRoot /var/www/html/xx</VirtualHost>

  8. GDB之常见错误

    1. dl-debug.c:74: No such file or directory. 如上图,当使用 gdb 调试执行 r 时,会出现如上打印. 解决方法如下: apt-get install e ...

  9. 用Python写一个将Python2代码转换成Python3代码的批处理工具

    之前写过一篇如何在windows操作系统上给.py文件添加一个快速处理的右键功能的文章:<一键将Python2代码自动转化为Python3>,作用就是为了将Python2的文件升级转换成P ...

  10. ArcGIS Python 保存lyr

    import arcpy ##################my = arcpy.GetParameterAsText(0)mylyrfile = arcpy.GetParameterAsText( ...