Spring AOP—深入动态代理(通俗易懂)
Spring AOP(面向切面编程)使用的动态代理技术,主要有两种方式:JDK动态代理和CGLIB动态代理。
JDK动态代理:
- 只能对实现了接口的类生成代理,不能针对类。
- 使用java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。
CGLIB动态代理:
- 可以对类实现代理,不需要类实现接口。
- 使用CGLIB库,通过继承要代理的类,重写其方法。
举例:
假设有一个接口和实现类:
public interface MyInterface {
void doSomething();
}
public class MyImpl implements MyInterface {
@Override
public void doSomething() {
System.out.println("原始方法执行");
}
}
使用Spring AOP创建代理对象:
@Configuration
@EnableAspectJAutoProxy
public class AopConfig {
@Bean
public MyImpl myImpl() {
return new MyImpl();
}
@Bean
public MyAspect myAspect() {
return new MyAspect();
}
}
@Aspect
public class MyAspect {
@Before("execution(* com.example.MyInterface.*(..))")
public void beforeAdvice(JoinPoint joinPoint) {
System.out.println("前置通知:" + joinPoint.getSignature().getName());
}
}
在这个例子中,Spring会在运行时为MyImpl
生成一个代理对象,当调用doSomething()
方法时,会先执行MyAspect
中定义的前置通知。这就是Spring AOP的基本使用方法,使得我们可以在不修改原始代码的情况下增加额外的行为,例如日志记录、事务管理等。
评论已关闭