@Configuration CGLIB提升特性

今天看了下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配置类;
 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 撸撸猫 设计师:C马雯娟 返回首页