spring aop概念及实战示例

简介: java中,每个类对于都是一个闭合的实体,在编程中有时候需要在已经开发完成的类中通过一项技术嵌入一些公用的方法,这项技术不用改变原代码。而这项技术就是面向切面编程,也就是aop。

一、 什么是aop
百度的解释:在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

我的个人理解:java中,每个类对于都是一个闭合的实体,在编程中有时候需要在已经开发完成的类中通过一项技术嵌入一些公用的方法,这项技术不用改变原代码。而这项技术就是面向切面编程,也就是aop。

二、 aop中的一些概念
了解了aop是什么之后,我们再看一下aop中有哪些东西:

1、切面(Aspect)
切面对于aop来说是一个类,这个类封装了嵌入到目标方法时,一些相关信息。

2、连接点(join point)
这个点就是所有在程序中明确定义的点,如方法调用,对类成员的访问以及异常处理程序块的执行等等。

3、切点(pointcut)
定义了一组有特殊修饰的连接点的规则,这些规则可以是正则、通配符等。

4、通知(advice)
在切点中需要执行的业务逻辑操作。

上述概念比较模糊,我们通过一些例子来类比一下:比如,我们去商场买衣服的时候,我们不知道哪些合适,所以我们把我们的身高体重跟导购说了之后,导购根据这些信息,给你找出来一些衣服试穿。这个例子中,切面(Aspect)就相当于我们去商场买衣服这个事件,连接点(join point)相当于商店中的所有衣服,而切点(pointcut)就是我们的身高体重,通知(advice)就是导购找到衣服之后给我们试穿。这个例子可能不太准确,但是差不多就这个意思。

三、利用aop实现项目中日志的嵌入
通常我们在项目中需要用到日志,日志用aop是怎么实现的呢?

1、首先在pom文件中引入依赖:

<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>


2、创建个切面类
image.png

3、在切面类中编写切点和通知
/**

  • @description 切点

*/
@Pointcut("@annotation(com.zyjournals.web.journaladmin.config.annotation.ArticleProcessLogAnn)")
public void pointCutMethod(){

}

/**

  • @description 通知

*/
@Before("pointCutMethod()")
public void doBefore(JoinPoint joinPoint){

System.out.println("方法执行前");

}
4、编写测试类
package com.yangkun.esstudy.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/log")
public class LogTestController {

@GetMapping("test")
public String test(){
    return "hello world";
}

}
5、测试结果
image.png 切入成功!

思考
aop面向切面编程,其实就是一个切面中包含的切点(寻找符合规则的连接点切入)和执行动作(通知),在找到符合的切点之后,根据通知的类型(前置通知、后置通知、环绕通知等)执行通知的业务逻辑,从而实现业务代码中嵌入log日志等与业务无关的代码逻辑。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
5天前
|
Java 开发者 Spring
Spring Framework 中的 @Autowired 注解:概念与使用方法
【4月更文挑战第20天】在Spring Framework中,@Autowired 注解是实现依赖注入(Dependency Injection, DI)的一种非常强大的工具。通过使用 @Autowired,开发者可以减少代码中的引用绑定,提高模块间的解耦能力
28 6
|
1月前
|
XML Java 数据库连接
spring boot 参数的过滤注解与实战
在Spring Boot应用中,对于入参的过滤,通常会涉及到对Web层的数据验证和处理。Spring Boot借助Spring框架提供了强大的验证框架支持,主要基于JSR-303/JSR-380(Bean Validation API)规范,以及Spring自身的@Valid或@Validated注解来实现请求参数的验证。以下是一些常见的使用案例来展示如何对参数进行过滤和验证。
29 1
|
1月前
|
监控 Java 开发者
Spring AOP动态代理
Spring AOP动态代理
43 1
|
1月前
|
Java Spring 容器
Spring的AOP失效场景详解
Spring的AOP失效场景详解
106 0
|
1月前
|
人工智能 JSON 前端开发
【Spring boot实战】Springboot+对话ai模型整体框架+高并发线程机制处理优化+提示词工程效果展示(按照框架自己修改可对接市面上百分之99的模型)
【Spring boot实战】Springboot+对话ai模型整体框架+高并发线程机制处理优化+提示词工程效果展示(按照框架自己修改可对接市面上百分之99的模型)
|
29天前
|
设计模式 Java Maven
Spring Aop 底层责任链思路实现-springaopdi-ceng-ze-ren-lian-si-lu-shi-xian
Spring Aop 底层责任链思路实现-springaopdi-ceng-ze-ren-lian-si-lu-shi-xian
34 1
|
27天前
|
安全 Java 数据安全/隐私保护
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
62 1
|
27天前
|
存储 XML 缓存
【深入浅出Spring原理及实战】「缓存Cache开发系列」带你深入分析Spring所提供的缓存Cache功能的开发实战指南(一)
【深入浅出Spring原理及实战】「缓存Cache开发系列」带你深入分析Spring所提供的缓存Cache功能的开发实战指南
62 0
|
1天前
|
安全 Java 数据库连接
[AIGC] Spring框架的基本概念和优势
[AIGC] Spring框架的基本概念和优势
|
13天前
|
Java 数据库 Spring
切面编程的艺术:Spring动态代理解析与实战
切面编程的艺术:Spring动态代理解析与实战
26 0
切面编程的艺术:Spring动态代理解析与实战