SpringBoot的动态代理默认用的哪个???

发布于:2024-07-13 ⋅ 阅读:(190) ⋅ 点赞:(0)

在 Spring Boot 中,动态代理的默认实现方式取决于被代理的对象的类型和具体配置:

  1. JDK 动态代理

    • 当代理的对象实现了一个或多个接口时,Spring 默认使用 JDK 动态代理。
    • JDK 动态代理只能代理实现了接口的类。
  2. 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 {
    @Override
    public 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 proxy
    System.out.println(AopUtils.isCglibProxy(myService));      // true if using CGLIB proxy
}

总之,Spring Boot 默认情况下会根据类是否实现接口来选择使用 JDK 动态代理或 CGLIB 动态代理。通过配置,可以强制选择使用哪种代理机制。


网站公告

今日签到

点亮在社区的每一天
去签到