Spring Aop详细介绍和代码分析

简介: @[TOC](目录)Spring AOP(面向切面编程)是 Spring 框架的一个重要组成部分,它提供了一种将横切关注点(如事务管理、安全性等)与业务逻辑分离的方式。AOP 采用代理模式,在运行时动态生成代理对象,并将横切关注点织入代理对象中。下面是 Spring AOP 的详细介绍、源代码分析以及具体案例分析:# 1. Spring AOP 介绍Spring AOP 提供了一种将横切关注点与业务逻辑分离的方式。它支持以下几种通知类型:- 前置通知(Before):在目标方法执行之前执行通知。 - 后置通知(After):在目标方法执行之后执行通知。 - 环绕通知(Aro

@TOC

Spring AOP(面向切面编程)是 Spring 框架的一个重要组成部分,它提供了一种将横切关注点(如事务管理、安全性等)与业务逻辑分离的方式。AOP 采用代理模式,在运行时动态生成代理对象,并将横切关注点织入代理对象中。
下面是 Spring AOP 的详细介绍、源代码分析以及具体案例分析:

1. Spring AOP 介绍

Spring AOP 提供了一种将横切关注点与业务逻辑分离的方式。它支持以下几种通知类型:

  • 前置通知(Before):在目标方法执行之前执行通知。
  • 后置通知(After):在目标方法执行之后执行通知。
  • 环绕通知(Around):在目标方法执行前后都执行通知。
  • 异常通知(Exception):在目标方法抛出异常时执行通知。
  • 最终通知(Finally):在目标方法执行完成(无论是正常返回还是抛出异常)之后执行通知。

    2. Spring AOP 源代码分析

    下面是 Spring AOP 的核心类及其功能:
    -朝面切点(TargetPoint):定义了切面的切入点,用于确定在哪些连接点上应用横切关注点。
  • 切面定义(AspectDefinition):定义了横切关注点的类型、名称以及切入点等信息。
  • 切面实现(AspectImplementation):实现了横切关注点的具体逻辑,用于织入代理对象中。
  • 代理对象(Proxy):根据切面定义生成的代理对象,用于动态织入横切关注点。
  • 切面通知(Advice):AOP 中的核心概念,用于表示横切关注点,可以在连接点上应用通知。
    通知的实现方式有以下几种:
  • 前置通知(BeforeAdvice):在目标方法执行之前执行通知。
  • 后置通知(AfterAdvice):在目标方法执行之后执行通知。
  • 环绕通知(AroundAdvice):在目标方法执行前后都执行通知。
  • 异常通知(ExceptionAdvice):在目标方法抛出异常时执行通知。
  • 最终通知(FinallyAdvice):在目标方法执行完成(无论是正常返回还是抛出异常)之后执行通知。

    3. Spring AOP 案例分析

    以下是一个简单的 Spring AOP 案例,演示了如何使用面向切面编程实现日志记录功能:
    首先,创建一个切面定义类 LoggingAspect,它包含一个环绕通知:
    import org.aspectj.lang.JoinPoint;  
    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.service..*())")  
     public void logBefore(JoinPoint joinPoint) {
           
         System.out.println("Before executing: " + joinPoint.getSignature().getName());  
     }  
    }
    
    然后,创建一个目标类 UserService,其中包含一个方法:
    import org.springframework.beans.factory.annotation.Autowired;  
    import org.springframework.stereotype.Service;
    @Service  
    public class UserService {
         
     @Autowired  
     private UserRepository userRepository;
     public User findById(Integer id) {
           
         User user = userRepository.findById(id).orElseThrow(() -> new RuntimeException("User not found"));  
         System.out.println("User found: " + user.getName());  
         return user;  
     }  
    }
    
    最后,在 Spring 配置类中启用 AOP:
    import org.springframework.context.annotation.Configuration;  
    import org.springframework.context.annotation.EnableAspectJAutoProxy;
    @Configuration  
    @EnableAspectJAutoProxy  
    public class AppConfig {
           
    }
    
    运行 UserService 的 findById() 方法时,控制台输出如下:
    Before executing: findById  
    User found: John Doe  
    After executing: findById
    
    这表明日志记录功能通过 AOP 横切关注点成功实现,且只在 findById() 方法执行时记录日志。
相关文章
|
7月前
|
XML 安全 Java
使用 Spring 的 @Aspect 和 @Pointcut 注解简化面向方面的编程 (AOP)
面向方面编程(AOP)通过分离横切关注点,如日志、安全和事务,提升代码模块化与可维护性。Spring 提供了对 AOP 的强大支持,核心注解 `@Aspect` 和 `@Pointcut` 使得定义切面与切入点变得简洁直观。`@Aspect` 标记切面类,集中处理通用逻辑;`@Pointcut` 则通过表达式定义通知的应用位置,提高代码可读性与复用性。二者结合,使开发者能清晰划分业务逻辑与辅助功能,简化维护并提升系统灵活性。Spring AOP 借助代理机制实现运行时织入,与 Spring 容器无缝集成,支持依赖注入与声明式配置,是构建清晰、高内聚应用的理想选择。
700 0
|
11月前
|
监控 安全 Java
Spring AOP实现原理
本内容主要介绍了Spring AOP的核心概念、实现机制及代理生成流程。涵盖切面(Aspect)、连接点(Join Point)、通知(Advice)、切点(Pointcut)等关键概念,解析了JDK动态代理与CGLIB代理的原理及对比,并深入探讨了通知执行链路和责任链模式的应用。同时,详细分析了AspectJ注解驱动的AOP解析过程,包括切面识别、切点表达式匹配及通知适配为Advice的机制,帮助理解Spring AOP的工作原理与实现细节。
1502 13
|
6月前
|
XML Java 数据格式
《深入理解Spring》:AOP面向切面编程深度解析
Spring AOP通过代理模式实现面向切面编程,将日志、事务等横切关注点与业务逻辑分离。支持注解、XML和编程式配置,提供五种通知类型及丰富切点表达式,助力构建高内聚、低耦合的可维护系统。
|
8月前
|
人工智能 监控 安全
如何快速上手【Spring AOP】?核心应用实战(上篇)
哈喽大家好吖~欢迎来到Spring AOP系列教程的上篇 - 应用篇。在本篇,我们将专注于Spring AOP的实际应用,通过具体的代码示例和场景分析,帮助大家掌握AOP的使用方法和技巧。而在后续的下篇中,我们将深入探讨Spring AOP的实现原理和底层机制。 AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的核心特性之一,它能够帮助我们解决横切关注点(如日志记录、性能统计、安全控制、事务管理等)的问题,提高代码的模块化程度和复用性。
|
8月前
|
设计模式 Java 开发者
如何快速上手【Spring AOP】?从动态代理到源码剖析(下篇)
Spring AOP的实现本质上依赖于代理模式这一经典设计模式。代理模式通过引入代理对象作为目标对象的中间层,实现了对目标对象访问的控制与增强,其核心价值在于解耦核心业务逻辑与横切关注点。在框架设计中,这种模式广泛用于实现功能扩展(如远程调用、延迟加载)、行为拦截(如权限校验、异常处理)等场景,为系统提供了更高的灵活性和可维护性。
|
XML Java 测试技术
Spring AOP—通知类型 和 切入点表达式 万字详解(通俗易懂)
Spring 第五节 AOP——切入点表达式 万字详解!
1064 25
|
XML 安全 Java
Spring AOP—深入动态代理 万字详解(通俗易懂)
Spring 第四节 AOP——动态代理 万字详解!
578 24
|
Java API 微服务
微服务——SpringBoot使用归纳——Spring Boot中的切面AOP处理——Spring Boot 中的 AOP 处理
本文详细讲解了Spring Boot中的AOP(面向切面编程)处理方法。首先介绍如何引入AOP依赖,通过添加`spring-boot-starter-aop`实现。接着阐述了如何定义和实现AOP切面,包括常用注解如`@Aspect`、`@Pointcut`、`@Before`、`@After`、`@AfterReturning`和`@AfterThrowing`的使用场景与示例代码。通过这些注解,可以分别在方法执行前、后、返回时或抛出异常时插入自定义逻辑,从而实现功能增强或日志记录等操作。最后总结了AOP在实际项目中的重要作用,并提供了课程源码下载链接供进一步学习。
1623 0
|
Java 开发者 微服务
微服务——SpringBoot使用归纳——Spring Boot中的切面AOP处理——什么是AOP
本文介绍了Spring Boot中的切面AOP处理。AOP(Aspect Oriented Programming)即面向切面编程,其核心思想是分离关注点。通过AOP,程序可以将与业务逻辑无关的代码(如日志记录、事务管理等)从主要逻辑中抽离,交由专门的“仆人”处理,从而让开发者专注于核心任务。这种机制实现了模块间的灵活组合,使程序结构更加可配置、可扩展。文中以生活化比喻生动阐释了AOP的工作原理及其优势。
593 0