spring aop原理是什么
原创Spring AOP原理浅析
Spring AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架的一个重要组成部分,它提供了一种强盛的做法来增长横切关注点,如日志、保险和事务管理,而不需要修改实际执行业务逻辑的代码。下面我们通过本文来探讨Spring AOP的原理。
1. AOP基本概念
在了解Spring AOP原理之前,我们需要先熟悉以下几个AOP的基本概念:
- 连接点(JoinPoint):程序执行过程中的某个特定点,如方法的执行或异常的抛出。
- 切点(Pointcut):匹配连接点的断言,用于确定哪些连接点会得到通知。
- 通知(Advice):切面的具体逻辑,即会在目标方法执行前后执行的代码。
- 切面(Aspect):通知和切点的组合,定义了何时、何地应用通知。
- 目标对象(Target):被一个或多个切面所通知的对象。
- AOP代理(AOP Proxy):由AOP框架创建的对象,用于实现切面的契约。
2. Spring AOP原理
Spring AOP使用Java代理来对目标对象进行方法拦截,从而在方法执行前后加入通知逻辑。下面我们分别介绍Spring AOP的两种代理做法:JDK动态代理和CGLIB代理。
2.1 JDK动态代理
当目标对象实现了接口时,Spring AOP会使用JDK动态代理来实现AOP。以下是JDK动态代理的核心原理:
- 通过实现
InvocationHandler
接口创建一个代理实例。 - 在代理实例中,拦截对目标对象的调用,然后选用切点匹配规则判断是否需要执行通知逻辑。
- 如果需要执行通知逻辑,则先执行通知逻辑,再调用目标对象的方法。
public interface UserService {
void addUser();
void deleteUser();
}
public class UserServiceImpl implements UserService {
public void addUser() {
System.out.println("添加用户");
}
public void deleteUser() {
System.out.println("删除用户");
}
}
public class JDKDynamicAopProxy implements InvocationHandler {
private Object target;
public JDKDynamicAopProxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 在这里添加通知逻辑
System.out.println("前置通知");
// 调用目标对象的方法
Object result = method.invoke(target, args);
// 在这里添加通知逻辑
System.out.println("后置通知");
return result;
}
}
2.2 CGLIB代理
当目标对象没有实现任何接口时,Spring AOP会使用CGLIB代理来实现AOP。以下是CGLIB代理的核心原理:
- 通过继承目标对象创建一个子类,并在子类中覆写需要拦截的方法。
- 在子类中,拦截对目标对象的调用,然后选用切点匹配规则判断是否需要执行通知逻辑。
- 如果需要执行通知逻辑,则先执行通知逻辑,再调用目标对象的方法。
注意:CGLIB代理做法需要在项目中引入CGLIB库。
3. 总结
通过本文的介绍,我们了解到Spring AOP通过JDK动态代理和CGLIB代理实现对目标对象的拦截,从而在不修改原有代码在出现的同时增长横切关注点。这使代码更加模块化,易于维护。