spring aop的核心是解耦横切关注点,通过动态代理实现:定义切点筛选方法,用通知描述增强逻辑,二者组成切面;容器启动时创建代理对象,运行时在目标方法前后插入通知,业务代码零侵入。

Spring AOP 的核心,是把日志、事务、权限这类重复出现、又跟具体业务无关的逻辑抽出来,单独写成“切面”,再不改一行业务代码的前提下,“悄悄加”到目标方法的前后或异常时执行。
关键概念不是孤立词,而是动作链条
它们描述的是“在哪拦截 → 拦哪些 → 做什么 → 怎么包装”的完整过程:
- 连接点(Join Point):所有能被拦截的“时机”,Spring 中特指方法调用——只要一个方法能被调用,它就是一个连接点;
-
切点(Pointcut):从所有连接点里“挑出真正要增强的那些”,靠表达式匹配,比如
execution(* com.example.service.*.*(..))表示只选 service 包下所有类的所有方法; -
通知(Advice):定义“在切点上做什么、什么时候做”,五种类型各司其职:
– @Before:方法执行前(如记录开始时间)
– @After:方法执行后(不管成功失败)
– @AfterReturning:正常返回后(可拿到返回值)
– @AfterThrowing:抛异常后(可捕获异常)
– @Around:最灵活,包裹整个方法(必须手动调用proceed(),否则原方法不执行); -
切面(Aspect):就是“切点 + 通知”的组合体,一个带
@Aspect注解的类,里面既有@Pointcut定义规则,又有各种通知方法,就是一个完整的切面。
目标对象和代理对象的关系要理清
你写的 UserServiceImpl 是目标对象,它只管业务逻辑;Spring 在运行时自动为它生成一个新对象——代理对象,这个对象既保留了原始方法,又嵌入了你的日志或事务逻辑。你从 Spring 容器里取出来的,实际就是这个代理对象。
所以调用必须走 Spring 容器管理的引用,直接 new UserServiceImpl() 是不会触发 AOP 的。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
织入和动态代理是落地的关键
织入(Weaving)就是把通知“塞进”目标方法的过程。Spring AOP 只在运行时织入,靠的是动态代理:
- 如果目标类实现了接口,用 JDK 动态代理(基于
java.lang.reflect.Proxy),轻量但只能代理接口; - 如果目标类没实现接口,用 CGLIB(生成子类),能代理普通类,但不能代理 final 类或方法。
两种方式都决定了:AOP 只能拦截 public 方法,且必须通过 Spring 管理的 Bean 引用调用才生效。
一句话串起来面试回答
AOP 是一种解耦横切关注点的思想,Spring 用动态代理实现它:先定义切点筛选方法,再用通知描述增强逻辑,两者组成切面;容器启动时为匹配的 Bean 创建代理对象,运行时在目标方法调用前后插入通知——业务代码零侵入,维护和扩展都更清晰。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










