Spring AOP原理(代理模式和源码解析)
在Spring框架中,AOP(Aspect-Oriented Programming)使用代理模式实现横切关注点的功能,如事务管理、日志记录、权限控制等。Spring AOP基于代理模式实现,主要有两种方式:JDK动态代理和CGLIB代理。
- JDK动态代理:用于代理实现了接口的类。Spring会使用
java.lang.reflect.Proxy
类和InvocationHandler
接口创建代理对象。 - CGLIB代理:用于代理没有实现接口的类或final类。CGLIB是一个代码生成的库,它在运行时动态生成一个目标类的子类来重写其方法。
源码解析部分:
Spring创建代理对象的核心方法在AbstractAutoProxyCreator
类中,具体步骤如下:
createProxy
:创建代理对象的方法。wrapIfNecessary
:判断是否需要创建代理。getAdvicesAndAdvisorsForBean
:获取应用到目标对象上的通知(Advice)和切面(Advisor)。
具体使用时,开发者需要配置AOP相关的Bean,如切面(Aspect)、通知(Advice)等,Spring容器会在需要时创建代理对象,并将通知织入到业务逻辑中。
示例代码:
// 配置切面和通知
@Configuration
@EnableAspectJAutoProxy
public class AopConfig {
@Bean
public MyAspect myAspect() {
return new MyAspect();
}
}
// 定义切面
@Aspect
public class MyAspect {
@Before("execution(* com.example.service.*.*(..))")
public void beforeMethod(JoinPoint joinPoint) {
System.out.println("Before method: " + joinPoint.getSignature());
}
}
// 业务服务
@Service
public class MyService {
public void myMethod() {
System.out.println("My service method");
}
}
// 主类
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AopConfig.class);
MyService myService = context.getBean(MyService.class);
myService.myMethod();
context.close();
}
}
在这个例子中,当调用myService.myMethod()
时,MyAspect
中的beforeMethod
会在业务方法调用前被调用。这就是AOP的基本使用和原理。
评论已关闭