1. 程序入口
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
2. AnnotationConfigApplicationContext
类有参构造器
其中MainConfig
类是自己写的配置类,我们从这一行代码来开始分析。Spring容器先从这一行代码开始来创建AnnotationConfigApplicationContext
类型的容器,利用类型构造器来创建对象。下面来看一下这个有参构造器方法执行了哪些操作。
public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
this(); // 1.
register(annotatedClasses); // 2.
refresh(); // 3.
}
第一行:this();
:调用AnnotationConfigApplicationContext
的无参构造器
第二行:register(annotatedClasses)
:对传入的配置类进行预处理与解析
第三行:refresh()
:容器的创建与刷新
3. AnnotationConfigApplicationContext
类的this()
方法
3.1 依次调用父类的构造方法
我们先看一下AnnotationConfigApplicationContext
类的类结构
由于AnnotationConfigApplicationContext
类的父类是GenericApplicationContext
类,因此在有参构造器中调用this()
时,首先执行父类GenericApplicationContext
类的构造器,那么我们先看看GenericApplicationContext
类的构造器。
private final DefaultListableBeanFactory beanFactory;
public GenericApplicationContext() {
this.beanFactory = new DefaultListableBeanFactory();
}
在这个构造器中,首先初始化一个DefaultListableBeanFactory
类型的对象,Spring加载的所有Bean都会放到DefaultListableBeanFactory中。
当然DefaultListableBeanFactory
类在执行构造方法的时候先调用其父类AbstractBeanFactory
的构造器,AbstractBeanFactory
在执行构造方法的时候先调用父类DefaultResourceLoader
类型的构造器。整个顺序就是上面类图的顺序。
public AbstractApplicationContext() {
this.resourcePatternResolver = getResourcePatternResolver();
}
public DefaultResourceLoader() {
this.classLoader = ClassUtils.getDefaultClassLoader();
}
3.2 AnnotationConfigApplicationContext
类的this()
方法
当父类方法全部调用对应的无参构造器后,我们来返回看AnnotationConfigApplicationContext
类的this()
方法。
public AnnotationConfigApplicationContext() {
// BeanDefinition读取器. BeanDefinition是描述bean注册的信息
this.reader = new AnnotatedBeanDefinitionReader(this);
// 创建BeanDefinition扫描器
this.scanner = new ClassPathBeanDefinitionScanner(this);
}
在this.reader = new AnnotatedBeanDefinitionReader(this)
中,传入的参数为this
,而this
的类型即当前类的类型,即:AnnotationConfigApplicationContext
类型。
3.3 this()
中调用 的AnnotatedBeanDefinitionReader
构造器
public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry) {
this(registry, getOrCreateEnvironment(registry));
}
private static Environment getOrCreateEnvironment(BeanDefinitionRegistry registry) {
Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
if (registry instanceof EnvironmentCapable) {
return ((EnvironmentCapable) registry).getEnvironment();
}
return new StandardEnvironment();
}
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);
// 注册注解配置的处理器。即项目中我们标注注解的类由下面注册的处理器解析
// 3.4 分析该方法
AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);