首页 > 编程语言 >【揭秘】Spring AOP:面向切面编程的神秘面纱!你也能成为编程高手

【揭秘】Spring AOP:面向切面编程的神秘面纱!你也能成为编程高手

时间:2024-11-07 15:43:59浏览次数:3  
标签:service Spring 编程 public 切面 AOP com example

Spring AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的一个重要特性,它允许开发者将横切关注点(如日志记录、事务管理、性能监控等)从业务逻辑代码中分离出来,通过定义切面(Aspect)来模块化这些横切关注点。

1. Spring AOP基础

1.1 引入依赖

首先,需要在项目中引入Spring AOP相关的依赖。如果使用Maven,可以在pom.xml中添加以下依赖:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>5.3.20</version>
</dependency>
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.7</version>
</dependency>
1.2 配置AOP

在Spring配置文件中启用AOP支持:

<aop:aspectj-autoproxy/>

或者使用Java配置:

@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
    // 其他bean定义...
}

2. 定义切面(Aspect)

一个切面通常包含一个或多个通知(Advice),这些通知定义了在目标方法执行的不同时间点(如方法调用前、后、异常抛出时)要执行的操作。

2.1 定义切面类
@Aspect
@Component
public class LoggingAspect {
    // 前置通知
    @Before("execution(* com.example.service.*.*(..))")
    public void logBefore(JoinPoint joinPoint) {
        System.out.println("Before method: " + joinPoint.getSignature().getName());
    }

    // 后置通知
    @After("execution(* com.example.service.*.*(..))")
    public void logAfter(JoinPoint joinPoint) {
        System.out.println("After method: " + joinPoint.getSignature().getName());
    }

    // 返回通知
    @AfterReturning(pointcut = "execution(* com.example.service.*.*(..))", returning = "result")
    public void logAfterReturning(JoinPoint joinPoint, Object result) {
        System.out.println("Method returned: " + result);
    }

    // 异常通知
    @AfterThrowing(pointcut = "execution(* com.example.service.*.*(..))", throwing = "error")
    public void logAfterThrowing(JoinPoint joinPoint, Throwable error) {
        System.out.println("Exception in method: " + error.getMessage());
    }
}

在这个例子中,我们定义了一个名为LoggingAspect的切面类,其中包含了四种不同类型的通知:

  • @Before:在目标方法执行之前执行。
  • @After:在目标方法执行之后执行。
  • @AfterReturning:在目标方法成功返回结果之后执行。
  • @AfterThrowing:在目标方法抛出异常之后执行。
2.2 定义切入点表达式

在上面的例子中,我们使用了切入点表达式execution(* com.example.service.*.*(..))来匹配所有位于com.example.service包及其子包中的类的所有方法。切入点表达式可以根据需要进行调整,以匹配特定的方法或类。

3. 示例应用

假设我们有一个简单的服务类:

package com.example.service;

import org.springframework.stereotype.Service;

@Service
public class UserService {
    public String getUserName() {
        return "John Doe";
    }
}

当我们调用UserServicegetUserName方法时,由于我们的切面类LoggingAspect已经配置好了相应的通知,所以会自动打印出日志信息:

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTest {
    @Autowired
    private UserService userService;

    @Test
    public void testGetUserName() {
        String userName = userService.getUserName();
        System.out.println("User name: " + userName);
    }
}

运行测试时,控制台输出如下:

Before method: getUserName
After method: getUserName
Method returned: John Doe
User name: John Doe

4. 总结

Spring AOP提供了一种强大的方式来处理横切关注点,使得业务逻辑和系统服务(如日志记录、事务管理等)能够更好地分离和复用。通过定义切面和切入点表达式,可以灵活地控制哪些方法需要被拦截以及在什么时机执行额外的操作。

标签:service,Spring,编程,public,切面,AOP,com,example
From: https://blog.csdn.net/Q2024107/article/details/143597346

相关文章

  • SpringBoot整合Thymeleaf详解
    文章目录SpringBoot整合Thymeleaf详解一、引言二、SpringBoot与Thymeleaf的整合1、配置Thymeleaf1.1、添加依赖1.2、配置属性2、创建Controller三、编写Thymeleaf模板四、总结SpringBoot整合Thymeleaf详解一、引言在现代JavaWeb开发中,SpringBoot因其简化配置和......
  • aardio零基础学编程:5 分钟写个下载软件
    废话不多说直接开干!桌面软件快速开发工具aardio[1]专注于桌面软件开发,体积仅6.5MB,提供了大量开源的标准库、扩展库-这些库基本都是由纯aardio代码实现,涉及到了桌面编程的方方面面。aardio中的所有库基本都是由作者一个人编写,所以拥有良好的一致性。aardio一直保......
  • 这可能是最好的Spring教程!即便无基础也能看懂的入门Spring,仍在持续更新。
    开启这样一个系列的原因    这一段时间都在学spring,但是在学习的过程中一直都很难找到一个通俗易懂,又带了学习体系的文章教程,很多地方都不懂,需要自己去慢慢查询和理解,感觉学起来很耗时,所以我自己就像写一个这样能通俗易懂的Spring入门,让其他想我一样的小白也能速通入门。 ......
  • SpringBoot推荐图书阅读系统6c613 带论文文档1万字以上,文末可获取,
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统内容;用户,图书分类,图书信息开题报告内容一、课题背景与意义随着信息时代的到来,图书馆和在线阅读平台的书籍数量急剧增加,用户在寻找适合自己的阅读材料时......
  • SpringBoot外卖服务系统k83px 本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统内容:用户,商家,店铺信息,菜品分类,菜品信息,店铺公告开题报告内容一、研究背景与意义随着互联网技术的飞速发展,人们的生活方式正在发生深刻变革。在餐饮......
  • Java并发编程 --- 并发容器
    ConcurrentHashMap基本介绍在JDK1.8中,它的数据结构:Node数组+链表/红黑树初始化/***Initializestable,usingthesizerecordedinsizeCtl.*/privatefinalNode<K,V>[]initTable(){Node<K,V>[]tab;intsc;while((tab=table)==null||tab.length......
  • Java并发编程 --- 线程安全
    为什么会有线程安全问题?为什么会存在线程安全问题呢?那我们先来探究一下JMM(Java内存模型)线程与JMM每个线程都有自己的工作内存,它会存储主内存中变量的Copy值,再对变量进行操作的时候,也是操作工作内存中变量的Copy值。当线程Dead(生命周期结束)时,才会将自己工作内存中的数据同......
  • 基于SpringBoot的Java教学支持系统开发指南
    1系统概述1.1研究背景随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理教学辅助平台的相关信息成为必然。开发合适的教学辅助平台,可以方便管理人员对教学辅助平台......
  • SpringBoot Java教学辅助平台:构建高效学习环境
    1系统概述1.1研究背景随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理教学辅助平台的相关信息成为必然。开发合适的教学辅助平台,可以方便管理人员对教学辅助平台......
  • 基于SpringBoot+Vue的网上超市设计与实现
    前言网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。因此超市商品销售信息的管理计算机化,系统化是必要的。设计开发网上超......