今天看了下Spring的@Configuration,即java类配置bean,(这个spring3的新功能,虽然现在已经spring5了,但是这种配置bean的方式也是比较火的)
做了如下测试,发现一个现象,先说这个现象,后面用自己的理解再简单实现一下。
先说现象:
在java配置类中加@Configuration,下面的声明bean的方法,就只会被调一次,也就是初始化的时候,哪怕是下面的方法直接互相引用,返回的new的对象的构造方法也只会调一次
而如果不加@Configuration,那么下面的方法如果有相互调用,那么返回的new的对象的构造方法就会被调多次
下面是测试代码:
@Configuration
@ComponentScan("com.zs.cglib")
//这个类作为配置类
public class CglibConfig {
@Bean
public TestDomain testDomain(){
return new TestDomain();
}
@Bean
public TestDomainTwo testDomainTwo(){
//这个方法会预先调用上一个方法
testDomain();
return new TestDomainTwo();
}
}
@Component("testDomain")
public class TestDomain {
public TestDomain() {
//构造参数打印,证明被调过
System.out.println("new TestDomain-------------");
}
}
@Component("testDomainTwo")
public class TestDomainTwo {
public TestDomainTwo() {
//构造参数打印,证明被调过
System.out.println("new TestDomainTwo-------------");
}
}
public class StartMain {
//启动测试
public static void main(String[] args) {
AnnotationConfigApplicationContext anno = new AnnotationConfigApplicationContext(CglibConfig.class);
System.out.println(anno.getBean(TestDomain.class));
System.out.println(anno.getBean(TestDomainTwo.class));
}
}
可以发现,如果CglibConfig加上@Configuration,就会打印出:
new TestDomain-------------
new TestDomainTwo-------------
如果把@Configuration去掉,就会打印出:
new TestDomain-------------
new TestDomain-------------
new TestDomainTwo-------------
也就是说,加上@Configuration,new出TestDomain实例只执行了一次,也就是说testDomainTwo()中调用的testDomain(),并没有new出新的TestDomain实例。
而把@Configuration去掉,TestDomain实例就会被new两次,也就是testDomainTwo()中调用的testDomain()也有new出TestDomain实例。
这是为什么呢?当然,肯定和@Configuration有关。
一般情况,我们把带有@Configuration的类叫做全注解配置类,也叫Full配置类;
我们把不带@Configuration的类叫Lite配置类;