下面将运行一个最基本的Demo,从容器获取C对象,直接Debug源码看看做了什么
AnnotationConfigApplicationContext类图,主要做了3件事情
- 查看父类GenericApplicationContext的构造方法,发现创建了一个DefaultListableBeanFactory,
public GenericApplicationContext() {
this.beanFactory = new DefaultListableBeanFactory();
}
查看AnnotationConfigApplicationContext构造器
public AnnotationConfigApplicationContext() {
// 读取器读取配置类,注册了一些处理器,如configurationClassPostProcessor,AutowiredAnnotationBeanProcessor
this.reader = new AnnotatedBeanDefinitionReader(this);
// 扫描器scanner的用处不是很大,它仅仅是在我们外部手动调用 .scan 等方法才有用,常规方式是不会用到scanner对象的
this.scanner = new ClassPathBeanDefinitionScanner(this);
}
- ClassPathBeanDefinitionScanner扫描器,用处不大,
- AnnotatedBeanDefinitionReader读取器,重要,看一下它的构造函数做了什么
public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry, Environment environment) {
Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
Assert.notNull(environment, "Environment must not be null");
this.registry = registry;
this.conditionEvaluator = new ConditionEvaluator(registry, environment, null);
AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);//注册元老级别的beandefination,最重要的就是ConfigurationClassPostProcessor
}
Debug进入AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);最终会调用AnnotationConfigUtils的registerAnnotationConfigProcessors方法,注册一系列元老级别的beandefination,其中就包括解析配置类的一个后置处理器ConfigurationClassPostProcessor,将用来解析配置类。
> public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors(
BeanDefinitionRegistry registry, @Nullable Object<