prepareContext的作用
1、应用初始化方法
applyInitializers(context)
protected void applyInitializers(ConfigurableApplicationContext context) {
for (ApplicationContextInitializer initializer : getInitializers()) {
Class<?> requiredType = GenericTypeResolver.resolveTypeArgument(
initializer.getClass(), ApplicationContextInitializer.class);
Assert.isInstanceOf(requiredType, context, "Unable to call initializer.");
initializer.initialize(context);
}
}
初始化类配置的sprign.factories文件中
可以自定义初始化类用于修改env,springcloud获取远程配置就是采用这个方式
2、load(context, sources.toArray(new Object[sources.size()]))注册入口类的定义信息
protected void load(ApplicationContext context, Object[] sources) {
BeanDefinitionLoader loader = createBeanDefinitionLoader(
getBeanDefinitionRegistry(context), sources);
if (this.beanNameGenerator != null) {
loader.setBeanNameGenerator(this.beanNameGenerator);
}
if (this.resourceLoader != null) {
loader.setResourceLoader(this.resourceLoader);
}
if (this.environment != null) {
loader.setEnvironment(this.environment);
}
loader.load();
}
- createBeanDefinitionLoader
- load
注册方法
最后会把入口类的bean的定义信息放入beanFactory的beanDefinitionMap属性中
在下一节refreshContext中会用到这个定义信息,主要就是用于获取配置类在项目中的位置,进而加载项目中的所有符合条件的beanDefinition