前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring加载流程源码分析01【super】

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

作者头像
用户4919348
发布2019-04-02 11:27:06
7050
发布2019-04-02 11:27:06
举报
文章被收录于专栏:波波烤鸭

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

Spring源码分析

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

代码语言:javascript
复制
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

代码语言:javascript
复制
public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)
		throws BeansException {
	// 1.初始化父类
	super(parent);
	// 2.设置本地的配置信息
	setConfigLocations(configLocations);
	// 3.完成Spring容器的初始化
	if (refresh) {
		refresh();
	}
}

上面的supersetConfigLocationrefresh分别就是我们需要重点介绍的。 Spring的类图,记录在此

super(parent)

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

代码语言:javascript
复制
public AbstractXmlApplicationContext(ApplicationContext parent) {
	super(parent);
}

在往上是AbstractRefreshableConfigApplicationContext的构造方法

代码语言:javascript
复制
public AbstractRefreshableConfigApplicationContext(ApplicationContext parent) {
	super(parent);
}

在往上是AbstractRefreshableApplicationContext的构造方法

代码语言:javascript
复制
public AbstractRefreshableApplicationContext(ApplicationContext parent) {
	super(parent);
}

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

代码语言:javascript
复制
public AbstractApplicationContext(ApplicationContext parent) {
	this();
	setParent(parent);
}

this()

先来看下this方法。

代码语言:javascript
复制
public AbstractApplicationContext() {
	this.resourcePatternResolver = getResourcePatternResolver();
}

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

代码语言:javascript
复制
protected ResourcePatternResolver getResourcePatternResolver() {
	return new PathMatchingResourcePatternResolver(this);
}

创建PathMatchingResourcePatternResolver对象的时候,AbstractApplicationContext将自身作为ResourceLoader传递给了PathMatchingResourcePatternResolver;

代码语言:javascript
复制
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);
}

setParent(parent)

代码语言:javascript
复制
@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处理准备好处理类

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年02月22日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Spring源码分析
    • super(parent)
      • this()
      • setParent(parent)
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档