接下来分析下AnnotatedBeanDefinitionReader的执行过程,即下面这段代码
public AnnotationConfigApplicationContext() {
this.reader = new AnnotatedBeanDefinitionReader(this);
this.scanner = new ClassPathBeanDefinitionScanner(this);
}
时序图如下:
获取Environment的逻辑如下:
/**
* Get the Environment from the given registry if possible, otherwise return a new
* StandardEnvironment.
*/
private static Environment getOrCreateEnvironment(BeanDefinitionRegistry registry) {
Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
if (registry instanceof EnvironmentCapable) {
Environment environment = ((EnvironmentCapable) registry).getEnvironment();
return ((EnvironmentCapable) registry).getEnvironment();
}
return new StandardEnvironment();
}
return ((EnvironmentCapable) registry).getEnvironment()即调用AbstractApplicationContext.getEnvironment
/**
* Return the {@code Environment} for this application context in configurable
* form, allowing for further customization.
* <p>If none specified, a default environment will be initialized via
* {@link #createEnvironment()}.
*/
@Override
public ConfigurableEnvironment getEnvironment() {
if (this.environment == null) {
this.environment = createEnvironment();
}
return this.environment;
}
/**
* Create and return a new {@link StandardEnvironment}.
* <p>Subclasses may override this method in order to supply
* a custom {@link ConfigurableEnvironment} implementation.
*/
protected ConfigurableEnvironment createEnvironment() {
return new StandardEnvironment();
}
通过时序图及获取Envrionment的代码逻辑,创建AnnotatedBeanDefinitionReader流程如下:首先获取应用环境,然后将registry与envrionment作为参数调用自身的构造函数,并实例化ConditionEvaluator,最后调用工具类AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry)注册到处理器。