AOP(面向切面编程,Aspect Oriented Programming)是当代 Java 开发中不可或缺的技术,被广泛应用于日志记录、权限认证、事务管理、性能监控等横切关注点。Spring AOP、AspectJ等框架大量使用AOP注解,极大地提升了项目的可维护性和扩展性。那么AOP注解的原理是什么?JDK动态代理、CGLIB动态代理在其中各自扮演怎样的角色?AOP注解又适合哪些场景?本文将带你深度剖析AOP注解实现的幕后机制和最佳实践。
一、AOP注解概念与应用
AOP通过预编译方式和运行期动态代理,实现对业务代码的无侵入增强。常见的AOP注解有:
@Aspect:定义切面@Pointcut:定义切入点@Before、@After、@Around等:定义通知类型@Transactional:事务管理的经典应用
应用场景如:
- 日志采集,方法通用统计
- 用户权限校验
- 事务、缓存、限流等服务治理
- 安全审计
二、AOP注解核心实现原理
AOP注解之所以能“自动地”实现横切增强,本质靠动态代理,即用代理类/对象“拦截”方法调用,在调用前后织入拓展逻辑。
1. AOP动态代理的整体流程
- 运行期,Spring 容器启动时扫描 @Aspect 注解的切面类和切入点表达式;
- 针对目标Bean,决定采用哪种代理技术(JDK还是CGLIB)生成代理类;
- 用户发起方法调用时,实际上先经过代理对象,由代理“织入”增强逻辑,然后调用目标业务方法;
- 方法调用前后、方法异常等环节都可追加自定义逻辑(即Advice通知)。
三、JDK动态代理原理
1. 基本原理
JDK动态代理基于反射,只能为实现了接口的类创建代理。生成的代理对象是目标接口的一个运行时实现类,通过实现InvocationHandler接口控制方法调用。
典型流程:
- 生成一个与目标对象实现相同接口的代理对象
- 所有方法调用都被转发到
InvocationHandler#invoke
2. JDK动态代理简易代码示例
import java.lang.reflect.*;
interface UserService {
void addUser();
}
class UserServiceImpl implements UserService {
@Override
public void addUser() {
System.out.println("add user.");
}
}
class LogHandler implements InvocationHandler {
private final Object target;
public

最低0.47元/天 解锁文章
478

被折叠的 条评论
为什么被折叠?



