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代理显示为$代理
在调试控制台中看起来像这样