> 技术文档 > Spring核心基础

Spring核心基础


文章目录

  • 1. 基本概念
  • 2. AOP
    • 2.1 AOP完整编写过程
    • 2.2 完整示例结构
    • 2.3 关键概念总结
    • 2.4 多切面
    • 2.5 AOP应用场景

1. 基本概念

  • IOC容器控制反转概述
    Spring 通过 IoC 容器来管理所有 Java 对象的实例化和初始化,控制对象与对象之间的依赖关系。将由 IoC 容器管理的 Java 对象称为 Spring Bean,它与使用关键字 new 创建的 Java 对象没有任何区别。
  • DI依赖注入
    实现控制反转的思想,指Spring创建对象的过程中,将对象依赖属性通过配置进行注入。
  • AOP基本概念
    AOP(Aspect Oriented Programming)是一种设计思想,是软件设计领域中的面向切面编程,它是面向对象编程的一种补充和完善,它以通过预编译方式和运行期动态代理方式实现,在不修改源代码的情况下,给程序动态统一添加额外功能的一种技术。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

2. AOP

Spring AOP(面向切面编程)通过代理模式实现横切关注点(如日志、事务、安全等)的模块化。
在这里插入图片描述

2.1 AOP完整编写过程

(1)在 Maven 项目中添加依赖:

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

(2) 定义切面(Aspect)
创建切面类,使用 @Aspect@Component 注解

import org.aspectj.lang.annotation.*;import org.springframework.stereotype.Component;@Aspect@Componentpublic class LoggingAspect { // 后续步骤在此定义切入点和通知}

(3) 定义切入点(Pointcut)
使用 @Pointcut 指定拦截位置:

@Pointcut(\"execution(* com.example.service.*.*(..))\")public void serviceLayerPointcut() {}
  • 表达式说明
    execution(* com.example.service.*.*(..)) 表示拦截 com.example.service 包下所有类的所有方法

(4)定义通知(Advice)

  • 通知方法的执行顺序:

    Spring核心基础

  • (1)前置通知(Before)
    在目标方法执行前运行:

@Before(\"serviceLayerPointcut()\")public void logMethodCall(JoinPoint joinPoint) { String methodName = joinPoint.getSignature().getName(); System.out.println(\"调用方法: \" + methodName);}
  • (2)后置通知(AfterReturning)
    在方法成功返回后执行:
@AfterReturning( pointcut = \"serviceLayerPointcut()\", returning = \"result\")public void logReturn(Object result) { System.out.println(\"方法返回: \" + result);}
  • (3) 异常通知(AfterThrowing)
    在方法抛出异常时执行:
@AfterThrowing( pointcut = \"serviceLayerPointcut()\", throwing = \"ex\")public void logException(Exception ex) { System.out.println(\"异常信息: \" + ex.getMessage());}
  • (4)环绕通知(Around)
    最强大的通知类型,控制方法执行:
@Around(\"serviceLayerPointcut()\")public Object measureTime(ProceedingJoinPoint joinPoint) throws Throwable { long start = System.currentTimeMillis(); Object result = joinPoint.proceed(); // 执行原方法 long duration = System.currentTimeMillis() - start; System.out.println(\"方法执行耗时: \" + duration + \"ms\"); return result;}

(5) 配置启用 AOP
在 Spring Boot 主类或配置类中启用 AOP:

@SpringBootApplication@EnableAspectJAutoProxy // 启用AOP代理public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }}

2.2 完整示例结构

src├── main│ ├── java│ │ ├── com.example│ │ │ ├── aspect│ │ │ │ └── LoggingAspect.java // 切面类│ │ │ ├── service│ │ │ │ └── UserService.java // 被拦截的服务│ │ │ └── Application.java // 主启动类

2.3 关键概念总结

概念 作用 实现注解 切面(Aspect) 横切逻辑的模块化单元 @Aspect 切入点(Pointcut) 定义拦截位置 @Pointcut 通知(Advice) 具体拦截逻辑实现 @Before/@Around连接点(JoinPoint) 拦截到的目标方法信息 JoinPoint参数

:Spring AOP 基于代理实现,默认使用 JDK 动态代理(需接口),若无接口则使用 CGLIB 代理。

2.4 多切面

  • 为什么需要多切面:
    在实际应用中,多个关注点往往同时存在。例如:
    • 日志切面:记录方法执行信息。
    • 安全切面:验证用户权限。
    • 事务切面:管理数据库事务。 多切面允许您将这些关注点分离,提高代码可维护性和复用性。每个切面独立开发,避免代码冗余。

@Order注解指定优先级(1为最高,3为最低)。

2.5 AOP应用场景

  • AOP在日志记录中的应用

    AOP(面向切面编程)通过拦截方法执行,实现无侵入式日志记录。例如,在方法调用前后自动记录参数、返回值或异常信息,避免业务代码与日志逻辑耦合。常见的框架如Spring AOP或AspectJ,可通过注解(如@Around)定义切面,统一处理日志输出。

  • AOP在事务管理中的应用

    Spring框架利用AOP实现声明式事务管理。通过@Transactional注解,AOP自动为方法添加事务边界(如开启、提交或回滚事务),无需手动编写重复的事务代码。切面会拦截标记了注解的方法,确保数据一致性。

  • AOP在性能监控中的应用

    通过AOP拦截关键方法,统计执行耗时或调用频率。例如,使用@Around切面记录方法运行时间,将数据上报至监控系统(如Prometheus)。这种方式无需修改原有代码,即可实现非侵入式的性能分析。

  • AOP在异常处理中的应用

    统一异常处理是AOP的典型场景。通过@AfterThrowing切面捕获特定异常(如数据库异常),转换为用户友好的错误信息或日志。避免在每个方法中重复try-catch块,提升代码可维护性。

历史阅读网站