前面给大家介绍了Spring中的IOC和AOP。本文开始带大家解读下Spring容器加载的过程。我们使用的Spring的版本是4.3.3.RELEASE
初学Spring我们第一个入口代码如下,我们就从这个入口开始探究
public static void main(String[] args) {
ApplicationContext ac =
new ClassPathXmlApplicationContext("applicationContext.xml");
User bean = ac.getBean("user",User.class);
System.out.println(bean);
}
从ClassPathXmlApplicationContext的构造方法开始查看
this中的参数
参数 | 值 |
---|---|
configLocation | applicationContext.xml |
parent | null |
refresh | true |
public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)
throws BeansException {
// 1.初始化父类
super(parent);
// 2.设置本地的配置信息
setConfigLocations(configLocations);
// 3.完成Spring容器的初始化
if (refresh) {
refresh();
}
}
上面的super 和 setConfigLocation及refresh分别就是我们需要重点介绍的。 Spring的类图,记录在此
super(parent)其实就是调用的AbstractXmlApplicationContext的构造方法
public AbstractXmlApplicationContext(ApplicationContext parent) {
super(parent);
}
在往上是AbstractRefreshableConfigApplicationContext的构造方法
public AbstractRefreshableConfigApplicationContext(ApplicationContext parent) {
super(parent);
}
在往上是AbstractRefreshableApplicationContext的构造方法
public AbstractRefreshableApplicationContext(ApplicationContext parent) {
super(parent);
}
在往上是AbstractApplicationContext构造方法,在此构造方法中就没有再显示的super(parent)了。
public AbstractApplicationContext(ApplicationContext parent) {
this();
setParent(parent);
}
先来看下this方法。
public AbstractApplicationContext() {
this.resourcePatternResolver = getResourcePatternResolver();
}
在该构造方法对resourcePatternResolver 变量赋值。resourcePatternResolver 的作用是根据路径得到类的Resource对象; 查看getResourcePatternResolver方法:
protected ResourcePatternResolver getResourcePatternResolver() {
return new PathMatchingResourcePatternResolver(this);
}
创建PathMatchingResourcePatternResolver对象的时候,AbstractApplicationContext将自身作为ResourceLoader传递给了PathMatchingResourcePatternResolver;
public PathMatchingResourcePatternResolver(ResourceLoader resourceLoader) {
Assert.notNull(resourceLoader, "ResourceLoader must not be null");
this.resourceLoader = resourceLoader;
}
@Override
public Resource getResource(String location) {
return getResourceLoader().getResource(location);
}
@Override
public void setParent(ApplicationContext parent) {
this.parent = parent; // null
if (parent != null) {
Environment parentEnvironment = parent.getEnvironment();
if (parentEnvironment instanceof ConfigurableEnvironment) {
getEnvironment().merge((ConfigurableEnvironment) parentEnvironment);
}
}
}
因为parent为null所以if语句中的代码不会执行,所以此if中的代码在此逻辑中不会执行,所以在此就没有分析的必要了。 初始化的第一部分就分析完毕了,这部分的主要工作是为后续Resource处理准备好处理类