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)
-
通知方法的执行顺序:
-
(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
@Pointcut
@Before
/@Around
等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
块,提升代码可维护性。