2026/4/18 9:06:50
网站建设
项目流程
seo网站快速排名软件,wordpress 短信通知,阿里云网站开发工具,网站建设一般用英文怎么说一、先明确核心概念#xff08;快速回顾#xff09;在动手前#xff0c;先理清 Spring AOP 的核心术语#xff0c;避免后续代码理解混乱#xff1a;切面#xff08;Aspect#xff09;#xff1a;封装 “横切逻辑” 的类#xff08;比如日志、权限校验、事务#xff0…一、先明确核心概念快速回顾在动手前先理清 Spring AOP 的核心术语避免后续代码理解混乱切面Aspect封装 “横切逻辑” 的类比如日志、权限校验、事务是 AOP 的核心载体。切点Pointcut定义 “哪些方法需要被增强”比如指定包下的所有 Service 方法。通知Advice定义 “增强的时机和逻辑”包括Before目标方法执行前执行After目标方法执行后执行无论是否异常AfterReturning目标方法正常返回后执行AfterThrowing目标方法抛出异常后执行Around环绕通知最灵活可控制目标方法的执行时机、参数、返回值连接点JoinPoint程序执行过程中可被增强的 “点”比如方法调用、异常抛出Spring 只支持方法级连接点。二、Spring AOP 实现步骤基于注解最常用Spring AOP 有两种实现方式注解式推荐和XML 配置式这里重点讲注解式步骤如下步骤 1引入依赖Maven/Gradle核心依赖是spring-context已包含 AOP 基础如果是 Spring Boot 项目只需引入spring-boot-starter即可非 Spring Boot 项目需手动引入xml!-- Spring核心AOP依赖 -- dependency groupIdorg.springframework/groupId artifactIdspring-context/artifactId version6.1.4/version !-- 适配Java 17按需调整版本 -- /dependency !-- Spring AOP增强可选简化切点表达式 -- dependency groupIdorg.springframework/groupId artifactIdspring-aspects/artifactId version6.1.4/version /dependency步骤 2开启 AOP 注解支持在 Spring 配置类上添加EnableAspectJAutoProxy注解启用 AOP 自动代理java运行import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableAspectJAutoProxy; // 配置类开启AOP注解支持 Configuration ComponentScan(com.example) // 扫描指定包下的Bean EnableAspectJAutoProxy public class SpringConfig { }步骤 3定义目标类被增强的业务类创建普通的 Spring Bean作为 AOP 的 “目标对象”java运行import org.springframework.stereotype.Service; // 业务层Bean作为AOP的目标类 Service public class UserService { // 待增强的方法1 public void addUser(String username) { System.out.println(执行添加用户逻辑 username); // 可手动抛出异常测试AfterThrowingthrow new RuntimeException(添加用户失败); } // 待增强的方法2 public String getUserById(Integer id) { System.out.println(执行查询用户逻辑id id); return 用户- id; } }步骤 4定义切面类封装横切逻辑创建切面类用Aspect标记同时标注为 Spring BeanComponent并定义切点和通知java运行import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component; // 1. 标记为切面类 Spring Bean Aspect Component public class LogAspect { // 2. 定义切点复用性高可被多个通知引用 // 切点表达式匹配com.example.service包下所有类的所有方法 Pointcut(execution(* com.example.service.*.*(..))) public void servicePointcut() {} // 3. 定义通知增强逻辑 // 前置通知目标方法执行前执行 Before(servicePointcut()) public void beforeAdvice(JoinPoint joinPoint) { // JoinPoint可获取目标方法名、参数等信息 String methodName joinPoint.getSignature().getName(); Object[] args joinPoint.getArgs(); System.out.println([前置通知] 方法 methodName 参数 java.util.Arrays.toString(args)); } // 后置返回通知目标方法正常返回后执行 AfterReturning(value servicePointcut(), returning result) public void afterReturningAdvice(JoinPoint joinPoint, Object result) { String methodName joinPoint.getSignature().getName(); System.out.println([返回通知] 方法 methodName 返回值 result); } // 异常通知目标方法抛出异常后执行 AfterThrowing(value servicePointcut(), throwing e) public void afterThrowingAdvice(JoinPoint joinPoint, Exception e) { String methodName joinPoint.getSignature().getName(); System.out.println([异常通知] 方法 methodName 异常 e.getMessage()); } // 环绕通知最灵活可控制目标方法执行 Around(servicePointcut()) public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable { String methodName joinPoint.getSignature().getName(); System.out.println([环绕前置] 开始执行方法 methodName); // 执行目标方法必须调用否则目标方法不会执行 Object result joinPoint.proceed(); System.out.println([环绕后置] 方法 methodName 执行完成); return result; // 可修改返回值 } }步骤 5测试 AOP 效果编写测试类启动 Spring 容器并调用目标方法java运行import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class AopTest { public static void main(String[] args) { // 初始化Spring容器 AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext(SpringConfig.class); // 获取目标Bean UserService userService context.getBean(UserService.class); // 调用目标方法触发AOP增强 userService.addUser(张三); System.out.println(-----分割线-----); userService.getUserById(1001); // 关闭容器 context.close(); } }执行结果正常情况plaintext[环绕前置] 开始执行方法addUser [前置通知] 方法addUser参数[张三] 执行添加用户逻辑张三 [环绕后置] 方法addUser执行完成 -----分割线----- [环绕前置] 开始执行方法getUserById [前置通知] 方法getUserById参数[1001] 执行查询用户逻辑id1001 [返回通知] 方法getUserById返回值用户-1001 [环绕后置] 方法getUserById执行完成三、关键知识点解析切点表达式execution 语法上面用的execution(* com.example.service.*.*(..))是最常用的切点表达式拆解如下*返回值任意第一个 *com.example.service.*匹配 service 包下的所有类.*匹配类下的所有方法(..)方法参数任意数量、类型都不限其他常用表达式匹配指定方法execution(public String com.example.service.UserService.getUserById(Integer))匹配注解annotation(org.springframework.transaction.annotation.Transactional)匹配加了 Transactional 的方法环绕通知的注意事项ProceedingJoinPoint是JoinPoint的子类只有环绕通知能使用。必须调用joinPoint.proceed()才能执行目标方法否则目标方法不会运行。可通过proceed(args)修改目标方法的参数也可修改返回值。AOP 的实现原理Spring AOP 基于动态代理实现如果目标类实现了接口使用 JDK 动态代理生成接口的代理类。如果目标类未实现接口使用 CGLIB 动态代理生成目标类的子类。EnableAspectJAutoProxy(proxyTargetClass true)强制使用 CGLIB 代理。四、总结Spring AOP 实现的核心步骤引入依赖 → 开启 AOP 注解 → 定义目标 Bean → 编写切面类Aspect 切点 通知 → 测试。注解式 AOP 是主流方式核心注解包括EnableAspectJAutoProxy开启 AOP、Aspect标记切面、Pointcut定义切点、各类通知注解Before/Around 等。环绕通知Around最灵活但使用成本稍高简单场景优先用 Before/AfterReturning 等简单通知。