IOC 容器的初始化包括 BeanDefinition 的 Resource 定位、載入和註冊這三個基本的過程。
以 ApplicationContext 爲例講解,ApplicationContext 系列容器也許是我們最熟悉的,因爲 Web 項 目 中 使 用 的XmlWebApplicationContext 就 屬 於 這 個 繼 承 體 系 , 還 有 ClasspathXmlApplicationContext 等,其繼承體系如下圖所示:
以ClassPathXmlApplicationContext爲例:
public ClassPathXmlApplicationContext(
String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)
throws BeansException {
//初始化父類
super(parent);
//設置本地的配置信息,創建環境對象ConfigurableEnvironment 、處理ClassPathXmlApplicationContext傳入的字符串中的佔位符;
setConfigLocations(configLocations);
//完成Spring容器初始化
if (refresh) {
refresh();
}
}
//初始化父類
super(parent);
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);
}
public AbstractApplicationContext() {
this.resourcePatternResolver = getResourcePatternResolver();
}
public void setParent(@Nullable ApplicationContext parent) {
this.parent = parent;
if (parent != null) {
Environment parentEnvironment = parent.getEnvironment();
if (parentEnvironment instanceof ConfigurableEnvironment) {
getEnvironment().merge((ConfigurableEnvironment) parentEnvironment);
}
}
}
繼承體系視圖如下所示: