Spring加载流程源码分析01【super】

举报
波波烤鸭 发表于 2022/03/30 02:03:56 2022/03/30
【摘要】   前面给大家介绍了Spring中的IOC和AOP。本文开始带大家解读下Spring容器加载的过程。我们使用的Spring的版本是4.3.3.RELEASE Spring加载流程源码分析03【ref...

  前面给大家介绍了Spring中的IOC和AOP。本文开始带大家解读下Spring容器加载的过程。我们使用的Spring的版本是4.3.3.RELEASE


Spring加载流程源码分析03【refresh】
Spring加载流程源码分析02【setConfigLocations】


IOC类图

在这里插入图片描述

Spring源码分析

  初学Spring我们第一个入口代码如下,我们就从这个入口开始探究

public static void main(String[] args) {
	ApplicationContext ac = 
			new ClassPathXmlApplicationContext("applicationContext.xml");
	User bean = ac.getBean("user",User.class);
	System.out.println(bean);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

  从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();
	}
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

上面的supersetConfigLocationrefresh分别就是我们需要重点介绍的。
Spring的类图,记录在此
在这里插入图片描述

super(parent)

super(parent)其实就是调用的AbstractXmlApplicationContext的构造方法

public AbstractXmlApplicationContext(ApplicationContext parent) {
	super(parent);
}

  
 
  • 1
  • 2
  • 3

在往上是AbstractRefreshableConfigApplicationContext的构造方法

public AbstractRefreshableConfigApplicationContext(ApplicationContext parent) {
	super(parent);
}

  
 
  • 1
  • 2
  • 3

在往上是AbstractRefreshableApplicationContext的构造方法

public AbstractRefreshableApplicationContext(ApplicationContext parent) {
	super(parent);
}

  
 
  • 1
  • 2
  • 3

在往上是AbstractApplicationContext构造方法,在此构造方法中就没有再显示的super(parent)了。

public AbstractApplicationContext(ApplicationContext parent) {
	this();
	setParent(parent);
}

  
 
  • 1
  • 2
  • 3
  • 4

this()

先来看下this方法。

public AbstractApplicationContext() {
	this.resourcePatternResolver = getResourcePatternResolver();
}

  
 
  • 1
  • 2
  • 3

在该构造方法对resourcePatternResolver 变量赋值。resourcePatternResolver 的作用是根据路径得到类的Resource对象;
查看getResourcePatternResolver方法:

protected ResourcePatternResolver getResourcePatternResolver() {
	return new PathMatchingResourcePatternResolver(this);
}

  
 
  • 1
  • 2
  • 3

创建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);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

setParent(parent)

@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);
		}
	}
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

因为parent为null所以if语句中的代码不会执行,所以此if中的代码在此逻辑中不会执行,所以在此就没有分析的必要了。
初始化的第一部分就分析完毕了,这部分的主要工作是为后续Resource处理准备好处理类

文章来源: dpb-bobokaoya-sm.blog.csdn.net,作者:波波烤鸭,版权归原作者所有,如需转载,请联系作者。

原文链接:dpb-bobokaoya-sm.blog.csdn.net/article/details/87870315

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。