面向切面编程(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. THUWC2020 游记

    不知道标题该叫什么,那就叫游记吧.反正是来玩的. CSP-S 排到我省三十几名,也不知怎么就过了 THU 的初审. Day0 到了宾馆.和 cy 划了一晚上. 发现自己不会做这次月考数学题,丢人啊丢人 ...

  2. 【线性代数】1-1:线性组合(Linear Combinations)

    title: [线性代数]1-1:线性组合(Linear Combinations) toc: true categories: Mathematic Linear Algebra date: 201 ...

  3. 在chrome开发者模式中查找你的js文件

    在chrom开发者模式中按ctrl+o查找你的js文件

  4. python 绘制五角星

    code import turtle n = eval(input("请输入五角星的长度")) turtle.begin_fill() #开始填充颜色 i = : turtle.f ...

  5. Android__adb 命令大全

    ADB 即 Android Debug Bridge,Android调试桥.ADB工作方式比较特殊,采用监听Socket TCP 端口的方式让IDE和Qemu通讯,默认情况下adb会daemon相关的 ...

  6. MOCK服务小结

    前言: 说到mock,大家会想到单测中的mock,测试同学会想到httpmock服务等. mock的作用:程序运行过程中,设定过滤规则及返回值,来满足固定的数据解析,解决不容易构造或者获取的数据对象. ...

  7. Redis高级特性及应用场景

    Redis高级特性及应用场景 redis中键的生存时间(expire) redis中可以使用expire命令设置一个键的生存时间,到时间后redis会自动删除它. 过期时间可以设置为秒或者毫秒精度. ...

  8. [Feature] Compare the effect of different scalers

    Ref: Compare the effect of different scalers on data with outliers 主要是对该代码的学习研究. from sklearn.prepro ...

  9. hive基础指令

  10. delphi 需要应用一个单元是,需要在工程里面先添加单元

    delphi 需要应用一个单元是,需要在工程里面先添加单元