spring aop概念及实战示例

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 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日志并进行多维度分析。
目录
相关文章
|
21天前
|
存储 缓存 Java
Spring高手之路23——AOP触发机制与代理逻辑的执行
本篇文章深入解析了Spring AOP代理的触发机制和执行流程,从源码角度详细讲解了Bean如何被AOP代理,包括代理对象的创建、配置与执行逻辑,帮助读者全面掌握Spring AOP的核心技术。
28 3
Spring高手之路23——AOP触发机制与代理逻辑的执行
|
6天前
|
Java Spring
[Spring]aop的配置与使用
本文介绍了AOP(面向切面编程)的基本概念和核心思想。AOP是Spring框架的核心功能之一,通过动态代理在不修改原代码的情况下注入新功能。文章详细解释了连接点、切入点、通知、切面等关键概念,并列举了前置通知、后置通知、最终通知、异常通知和环绕通知五种通知类型。
15 1
|
16天前
|
自然语言处理 Java API
Spring Boot 接入大模型实战:通义千问赋能智能应用快速构建
【10月更文挑战第23天】在人工智能(AI)技术飞速发展的今天,大模型如通义千问(阿里云推出的生成式对话引擎)等已成为推动智能应用创新的重要力量。然而,对于许多开发者而言,如何高效、便捷地接入这些大模型并构建出功能丰富的智能应用仍是一个挑战。
69 6
|
20天前
|
缓存 NoSQL Java
Spring Boot与Redis:整合与实战
【10月更文挑战第15天】本文介绍了如何在Spring Boot项目中整合Redis,通过一个电商商品推荐系统的案例,详细展示了从添加依赖、配置连接信息到创建配置类的具体步骤。实战部分演示了如何利用Redis缓存提高系统响应速度,减少数据库访问压力,从而提升用户体验。
52 2
|
2天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
6 0
|
2月前
|
设计模式 Java 测试技术
spring复习04,静态代理动态代理,AOP
这篇文章讲解了Java代理模式的相关知识,包括静态代理和动态代理(JDK动态代理和CGLIB),以及AOP(面向切面编程)的概念和在Spring框架中的应用。文章还提供了详细的示例代码,演示了如何使用Spring AOP进行方法增强和代理对象的创建。
spring复习04,静态代理动态代理,AOP
|
2月前
|
Java 测试技术 数据库
Spring事务传播机制(最全示例)
在使用Spring框架进行开发时,`service`层的方法通常带有事务。本文详细探讨了Spring事务在多个方法间的传播机制,主要包括7种传播类型:`REQUIRED`、`SUPPORTS`、`MANDATORY`、`REQUIRES_NEW`、`NOT_SUPPORTED`、`NEVER` 和 `NESTED`。通过示例代码和数据库插入测试,逐一展示了每种类型的运作方式。例如,`REQUIRED`表示如果当前存在事务则加入该事务,否则创建新事务;`SUPPORTS`表示如果当前存在事务则加入,否则以非事务方式执行;`MANDATORY`表示必须在现有事务中运行,否则抛出异常;
119 4
Spring事务传播机制(最全示例)
|
1月前
|
Java 编译器 Spring
Spring AOP 和 AspectJ 的区别
Spring AOP和AspectJ AOP都是面向切面编程(AOP)的实现,但它们在实现方式、灵活性、依赖性、性能和使用场景等方面存在显著区别。‌
51 2
|
1月前
|
Java Spring 容器
Spring IOC、AOP与事务管理底层原理及源码解析
【10月更文挑战第1天】Spring框架以其强大的控制反转(IOC)和面向切面编程(AOP)功能,成为Java企业级开发中的首选框架。本文将深入探讨Spring IOC和AOP的底层原理,并通过源码解析来揭示其实现机制。同时,我们还将探讨Spring事务管理的核心原理,并给出相应的源码示例。
118 9
|
1月前
|
Java 数据库连接 Spring
【2021Spring编程实战笔记】Spring开发分享~(下)
【2021Spring编程实战笔记】Spring开发分享~(下)
25 1