Spring - 如何知道cglib或jdk动态代理是否应用于bean

时间:2017-05-05 15:00:12

标签: spring

我正在攻读Spring Core证书考试,我正在对该框架进行一些测试。

我想知道是否有办法知道Bean是否被CGLIB或JDK库代理。

我已经知道了一些基本概念,比如如果你使用接口声明一个Bean,Spring将使用JDK来代理它(除非你另有说明)。如果直接在类上声明bean,它将使用CGLIB通过继承来代理它。

我想知道的是,在调试时应该查找什么来检查使用了哪个库。

鉴于以下代码,当我调试它时,我看不到所创建的bean实例的任何差异。我期待在没有接口的bean中看到类似ConcreteBean $ CGLIB的东西......

编辑:我现在明白代理只是在春天创建时需要由PostProcessor添加功能,但是,我仍然想知道在调试器中查找要查找的内容是否已应用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();
    }
}

1 个答案:

答案 0 :(得分:0)

当一个bean被Spring CGLIB代理包装时,它声明了$$ EnhancerBySpringCGLIB。

JDK代理显示为$ Proxy

It looks like this in the debugging console