首页 > 编程语言 >深入探讨 Spring 6 的面向切面编程(AOP)

深入探讨 Spring 6 的面向切面编程(AOP)

时间:2024-07-18 11:10:10浏览次数:17  
标签:Spring AOP 切面 org import UserService

深入探讨 Spring 6 的面向切面编程(AOP)

大家好,今天我们来聊聊 Spring 6 中的面向切面编程(AOP)。AOP 是 Spring 框架中一个非常强大的特性,它可以帮助我们在不改变原有代码的情况下,添加一些通用的功能,比如日志记录、事务管理、安全检查等。

什么是 AOP?

AOP,全称 Aspect-Oriented Programming,翻译过来就是面向切面编程。简单来说,AOP 允许我们将那些与业务逻辑无关的代码(如日志、事务、安全等)从业务逻辑中分离出来。这样做的好处是可以让我们的代码更加简洁、可读和可维护。

AOP 的核心概念

在深入代码之前,我们先来了解一下 AOP 的几个核心概念:

  1. Aspect(切面):切面是 AOP 的核心模块,它包含了横切关注点的逻辑。一个切面可以包含多个通知(Advice)。
  2. Join Point(连接点):连接点是程序执行的某个特定点,比如方法调用或异常抛出。
  3. Advice(通知):通知是切面在特定连接点执行的动作。通知有多种类型,包括前置通知、后置通知、环绕通知等。
  4. Pointcut(切入点):切入点定义了在哪些连接点上执行通知。它通常是一些表达式,用来匹配连接点。
  5. Weaving(织入):织入是将切面应用到目标对象并创建代理对象的过程。织入可以在编译时、类加载时和运行时进行。

Spring 6 中的 AOP 实现

Spring 6 提供了多种方式来实现 AOP,包括基于 XML 配置、基于注解和基于纯 Java 配置。今天我们主要讲解基于注解的方式,因为这种方式更加简洁和直观。

示例代码

我们通过一个简单的示例来演示如何在 Spring 6 中使用 AOP。假设我们有一个简单的业务类 UserService,我们希望在每次调用其方法时记录日志。

首先,我们需要添加 Spring AOP 相关的依赖。在 pom.xml 中添加以下依赖:

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

接下来,我们创建一个业务类 UserService

package com.example.demo.service;

import org.springframework.stereotype.Service;

@Service
public class UserService {

    public void createUser(String username) {
        System.out.println("Creating user: " + username);
    }

    public void deleteUser(String username) {
        System.out.println("Deleting user: " + username);
    }
}

然后,我们创建一个切面类 LoggingAspect,在方法执行前后记录日志:

package com.example.demo.aspect;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LoggingAspect {

    @Before("execution(* com.example.demo.service.UserService.*(..))")
    public void logBefore() {
        System.out.println("Method execution start");
    }

    @After("execution(* com.example.demo.service.UserService.*(..))")
    public void logAfter() {
        System.out.println("Method execution end");
    }
}

在这个切面类中,我们使用了两个注解 @Before@After,分别在方法执行前后记录日志。execution(* com.example.demo.service.UserService.*(..)) 是一个切入点表达式,表示匹配 UserService 类中的所有方法。

最后,我们需要在 Spring Boot 应用程序类中启用 AOP:

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@SpringBootApplication
@EnableAspectJAutoProxy
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

至此,我们的 AOP 配置就完成了。现在,当我们调用 UserService 的方法时,日志就会自动记录下来:

package com.example.demo;

import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class AppRunner implements CommandLineRunner {

    @Autowired
    private UserService userService;

    @Override
    public void run(String... args) throws Exception {
        userService.createUser("John");
        userService.deleteUser("John");
    }
}

运行程序,你会看到如下输出:

Method execution start
Creating user: John
Method execution end
Method execution start
Deleting user: John
Method execution end

总结

通过这个简单的示例,我们可以看到 AOP 如何帮助我们在不改变业务逻辑代码的情况下,添加一些通用的功能。Spring 6 的 AOP 功能非常强大且易于使用,希望大家能在实际项目中充分利用这一特性。

如果你有任何问题或建议,欢迎在评论区留言。谢谢大家的阅读,我们下次再见!

百万大学生都在用的AI写论文工具,篇篇无重复

标签:Spring,AOP,切面,org,import,UserService
From: https://www.cnblogs.com/zhizu/p/18309091

相关文章

  • 使用Spring Boot AOP和自定义注解优雅实现操作日志记录
    使用SpringBootAOP和自定义注解优雅实现操作日志记录大家好,今天我们来聊聊如何在SpringBoot项目中,通过AOP(面向切面编程)和自定义注解,优雅地实现操作日志记录。操作日志对于系统的可维护性和安全性至关重要,它能帮助我们追踪用户行为,排查问题。什么是AOP?AOP,全称Aspect-Oriented......
  • 使用Spring Boot实现图形验证码:从零开始的详细教程
    使用SpringBoot实现图形验证码:从零开始的详细教程在现代Web应用中,图形验证码是一种常见的防止机器人和恶意攻击的手段。今天,我们将深入探讨如何在SpringBoot项目中实现图形验证码。通过这个教程,你将学会如何生成和验证图形验证码,并将其集成到你的SpringBoot应用中。一、项目......
  • SpringBoot与Thymeleaf模板技术整合
    以下是一个简单的SpringBoot整合Thymeleaf的入门案例:1.创建一个SpringBoot项目,并添加Thymeleaf依赖。org.springframework.bootspring-boot-starter-thymeleaforg.springframework.bootspring-boot-starter-web2.在src/main/resources/templates目录下创建一个HTML模......
  • 基于java+springboot+vue的影视影院订票选座管理系统(源码+LW+部署讲解)
    前言......
  • 基于java+springboot+vue的学生毕业离校系统(源码+LW+部署讲解)
    前言......
  • SpringMVC:@ResponseBody注解与HttpServletResponse对象
    在SpringMVC框架中,@ResponseBody注解和HttpServletResponse对象都扮演着将处理结果发送回客户端的重要角色,但它们的使用方式和目的有所不同。@ResponseBody@ResponseBody注解用于将方法的返回值绑定到web响应体(responsebody)上。当你使用@ResponseBody注解一个方法的返回值时,Sp......
  • 【第3章】Spring Cloud之Nacos服务端权限认证
    文章目录前言一、默认控制台登录页二、鉴权1.相关参数2.服务端开启鉴权2.1开启鉴权2.2自定义密钥3.开启服务身份识别功能4.开启Token缓存功能三、效果四、用户列表总结前言上一章我们访问了控制台,这里为了安全我们开启Nacos的权限认证。一、默认控制台登录......
  • 【第4章】Spring Cloud之Nacos单机模式支持mysql
    文章目录前言一、初始化1.初始化数据库2.修改配置文件二、效果1.重新启动2.新增用户总结前言在0.7版本之前,在单机模式时nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,具体的操作步骤:安装数据库,版本要......
  • Spring Cloud Alibaba——OpenFeign
            OpenFeign是一个显示声明式的WebService客户端。使用OpenFeign能让编写WebService客户端更加简单。使用时只需定义服务接口,然后在上面添加注解。OpenFeign也支持可拔插式的编码和解码器。Springcloud对feign进行了封装,使其支持MVC注解和HttpMessageConverts......
  • Spring AOP当方法被内部调用时,增强逻辑失效问题原因及解决方案
    首先,这个问题本质原因和我之前写的这篇文章《Spring事务调用类自己方法失效解决办法和原因》是一样的,都是动态代理失效导致的。最近在开发中遇到了一个关于SpringAOP的问题。需求是统计某个方法的调用次数,我尝试使用SpringAOP来实现,但发现当方法被内部调用时,增强逻辑不生效。以......