ClassPathXmlApplicationContext:
public ClassPathXmlApplicationContext(
String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)
throws BeansException {
//设置传入进来的父容器、创建Bean资源解析器
super(parent); // 1
//将传入进来的配置文件路径(如spring/aaa.xml,spring/bbb.xml)保存起来
setConfigLocations(configLocations); // 2
if (refresh) {
//初始化最核心的方法,就是refresh()
//把所有的Bean重新构造一遍
refresh(); // 3
}
}
代码1调用链如下:
AbstractXmlApplicationContext:
public AbstractXmlApplicationContext(@Nullable ApplicationContext parent) {
super(parent);
}
AbstractRefreshableConfigApplicationContext:
public AbstractRefreshableConfigApplicationContext(@Nullable ApplicationContext parent) {
super(parent);
}
AbstractRefreshableApplicationContext:
public AbstractRefreshableApplicationContext(@Nullable ApplicationContext parent) {
super(parent);
}
AbstractApplicationContext:
public AbstractApplicationContext(@Nullable ApplicationContext parent) {
this();
setParent(parent);
}
此处分两步:
第一步:调用AbstractApplicationContext的无参构造器,初始化ResourcePatternResolver对象,其对应的实现是PathMatchingResourcePatternResolver。
public AbstractApplicationContext() {
this.resourcePatternResolver = getResourcePatternResolver();
}
protected ResourcePatternResolver getResourcePatternResolver() {
return new PathMatchingResourcePatternResolver(this);
}
第二步:保存父容器,并将父容器的环境与当前容器环境合并。
AbstractApplicationContext:
public void setParent(@Nullable ApplicationContext parent) {
this.parent = parent;
if (parent != null) {
Environment parentEnvironment = parent.getEnvironment();
if (parentEnvironment instanceof ConfigurableEnvironment) {
//假如有父上下文,则将当前环境与父上下文的环境合并
getEnvironment().merge((ConfigurableEnvironment) parentEnvironment);
}
}
}