簡體   English   中英

春季-如何知道cglib或jdk動態代理是否已應用於bean

[英]Spring - How to know if cglib or jdk dynamic proxy was applied to a bean

我正在學習Spring Core認證考試,並且正在對框架進行一些測試。

我想知道是否有辦法知道Bean是否由CGLIB或JDK庫代理。

我已經知道一些基本概念,例如,如果您使用接口聲明Bean,Spring將使用JDK對其進行代理(除非另行說明)。 而且,如果直接在類上聲明bean,它將使用CGLIB通過繼承對其進行代理。

我想知道的是在調試以檢查使用哪個庫時應該尋找什么。

給定以下代碼,當我調試它時,在創建的bean實例中看不到任何區別。 我期望在沒有接口的bean中看到類似ConcreteBean $ CGLIB的東西。

編輯:我現在知道代理僅在需要由PostProcessor添加功能時才由Spring創建,但是,我仍然想知道在調試器中查找什么以查找是否應用了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();
    }
}

當一個Spring CGLIB代理包裝一個bean時,它聲明$$ EnhancerBySpringCGLIB。

JDK代理顯示為$ Proxy

在調試控制台中看起來像這樣

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM