spring ConfigurationClassEnhancer

类全路径

org.springframework.context.annotation.ConfigurationClassEnhancer,它的作用是什么呢?

引用https://blog.csdn.net/andy_zhang2007/article/details/86726507的表述:


Spring中存在这样一个工具类ConfigurationClassEnhancer,它会对应用中每个配置类,也就是一般通过@Configuration注解定义的类进行一个增强。通过增强以后,配置类中使用@Bean注解的bean定义方法就不再是普通的方法了,它们具有了如下跟bean作用域有关的能力,以单例bean为例 :
1. 它们首次被调用时,相应方法逻辑会被执行用于创建bean实例;
2. 再次被调用时,不会再执行创建bean实例,而是根据bean名称返回首次该方法被执行时创建的bean实例。
 

也就是说

我们有这样的代码:

@Configuration
public class ConfigTest {

    @Bean("dog")
    public Dog getDog() {
        System.out.println("getDog");
        return new Dog();
    }

    @Bean("cat")
    @DependsOn("dog")
    public Cat getCat() {
        System.out.println("getCat");
        Cat cat = new Cat();
        cat.setDog(getDog());
        return cat;
    }
}

虽然在getCat方法里,调用了getDog方法,但是实际上这个方法是被代理掉了,返回的spring容器内已经创建好的Dog的实例。

如果执行下面的方法,根据输出也可以看出getDog这个方法里的输出只会输出一次。

public class MainTest {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConfigTest.class);
    }
}

 

你可能感兴趣的:(spring)