Java开发-面试题-0035-Spring代理方式有哪些
更多内容欢迎关注我(持续更新中,欢迎Star✨)
Github:CodeZeng1998/Java-Developer-Work-Note
(技术)微信公众号:CodeZeng1998
(生活)微信公众号:好锅
其他平台:CodeZeng1998、好锅
Spring 中的代理方式主要有两种:JDK 动态代理和CGLIB 代理。两者在 Spring AOP 和 事务管理 中都被广泛使用。下面是对这两种代理方式的详细说明:
1. JDK 动态代理
概念:
JDK 动态代理是基于 Java 的 java.lang.reflect.Proxy
类和 InvocationHandler
接口来实现的。它只针对接口进行代理,因此代理类必须实现某个接口。
工作原理:
- JDK 动态代理通过在运行时生成一个代理类,该代理类实现了目标对象所实现的接口。
- 当代理对象调用接口中的方法时,代理类会拦截该方法调用,并将其交由
InvocationHandler
处理。 - 在
InvocationHandler
中,开发者可以定义代理逻辑,例如方法执行前后增强、权限检查、事务管理等。
特点:
- 只能代理实现了接口的类。
- 代理是基于接口调用的,因此目标对象必须实现一个或多个接口。
- 代理类是在运行时动态生成的,无需在编译时定义。
使用场景:
Spring 会优先选择使用 JDK 动态代理,前提是目标类有实现接口,比如通过 AOP 进行事务控制时,常见的 service 层使用的是接口。
示例代码:
public interface Service {
void perform();
}
public class ServiceImpl implements Service {
@Override
public void perform() {
System.out.println("Performing service operation...");
}
}
public class ServiceInvocationHandler implements InvocationHandler {
private final