在 Spring Boot 中,動態代理的默認實現方式取決于被代理的對象的類型和具體配置:
-
JDK 動態代理:
- 當代理的對象實現了一個或多個接口時,Spring 默認使用 JDK 動態代理。
- JDK 動態代理只能代理實現了接口的類。
-
CGLIB 動態代理:
- 當代理的對象沒有實現任何接口時,Spring 會使用 CGLIB 動態代理。
- CGLIB 動態代理是通過生成目標類的子類來實現代理的,因此它不要求目標類實現接口。
配置優先級
默認情況下,Spring 會根據上面的規則自動選擇代理方式。但是,如果你希望強制使用特定的代理方式,可以通過配置來實現。例如,在 Spring 的 application.properties
文件中可以配置:
-
強制使用 JDK 動態代理:
spring.aop.proxy-target-class=false
-
強制使用 CGLIB 動態代理:
spring.aop.proxy-target-class=true
示例代碼
假設有一個服務接口和它的實現類:
public interface MyService {void performTask();
}@Service
public class MyServiceImpl implements MyService {@Overridepublic void performTask() {// Task implementation}
}
根據默認行為,如果你對 MyServiceImpl
使用代理且沒有任何特殊配置,Spring 將使用 JDK 動態代理,因為 MyServiceImpl
實現了 MyService
接口。
檢查代理類型
你可以通過以下代碼檢查 Spring 使用的是哪種代理:
@Autowired
private ApplicationContext applicationContext;public void checkProxy() {MyService myService = applicationContext.getBean(MyService.class);System.out.println(AopUtils.isJdkDynamicProxy(myService)); // true if using JDK proxySystem.out.println(AopUtils.isCglibProxy(myService)); // true if using CGLIB proxy
}
總之,Spring Boot 默認情況下會根據類是否實現接口來選擇使用 JDK 動態代理或 CGLIB 動態代理。通過配置,可以強制選擇使用哪種代理機制。