春季 - 如何知道将CGLIB或JDK动态代理应用于Bean



im正在为弹簧核心证书学习,我正在对框架进行一些测试。

我想知道是否有办法知道bean是由CGLIB或JDK库代理的。

我已经知道基本概念,例如如果您使用接口Spring声明bean,则将使用JDK代理它(除非您另有说明(。如果您直接在类上声明bean,它将通过使用CGLIB继承来代理它。

我想知道的是在调试使用哪个库时我应该寻找什么。

给定以下代码,当我调试它时,我没有看到创建的bean实例有任何区别。我期望在没有界面的bean中看到类似ConcreteBean $ cglib ...

编辑:我现在知道,Proxies仅在春季创建时创建的功能是由后处理器添加的,但是我还是想知道在调试器中寻找什么,以查找是否是否是否应用CGLIB。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MainConfig.class)
public class ProxiesTest {
    @Autowired
    RandomBean randomBean;
    @Autowired
    ConcreteBean concreteBean;
    public void setUp() {
    }
    @Test
    public void randomBeanTest() {
        randomBean.doSomething();
    }
    @Test
    public void concreteBeanTest() {
        concreteBean.doSomething();
    }
}
public class ConcreteBean {
    public void doSomething() {
        String concreteBean = "hello";
    }
    @PreDestroy
    public void destroy() {
        System.out.print("ConcreteBean Destroy");
    }
}
public interface RandomBean {
    public void doSomething();
    public void destroy();
}
public class RandomBeanImpl implements RandomBean {
    @Autowired
    ApplicationContext context;
    public void doSomething() {
        context.getParentBeanFactory();
    }
    public void destroy() {
        System.out.print("RandomBean destroyed");
    }
}
@Configuration
@ComponentScan(basePackages = "com.certification.postprocessors")
public class MainConfig {
    @Bean
    public ConcreteBean concreteBean(){
        return new ConcreteBean();
    }
    @Bean
    public RandomBean randomBean() {
        return new RandomBeanImpl();
    }
}

当bean被弹簧cglib代理包裹时,它指示

JDK代理显示为$代理

在调试控制台中看起来像这样