Spring 源码梳理(一)之 ClassPathXmlApplicationContext

用户头像
彭阿三
关注
发布于: 2020 年 07 月 01 日

我们了解spring源码在平时的开发中能够更快速的去定位问题,并且能够去学习这些框架中的设计模式



环境搭建

1.在idea中创建一个maven工程

相信大家都很熟悉,所以本文中略过。

2.创建一个java类
public class App {
public void say(){
System.out.println("App.say()");
}
}
3.创建SpringBean配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">



<bean id="app" class="com.mycompany.demo.classPathXmlApplicatonContext.App"></bean>


<bean id="myApp" class="com.mycompany.demo.classPathXmlApplicatonContext.MyApp"></bean>
</beans>
4.pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>study</groupId>
<artifactId>-02</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>4.1.3.RELEASE</spring.version>
</properties>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>


</project>
5.创建一个main函数入口
public class Test {
public static void main(String[] args) {
@SuppressWarnings("resource")
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("SpringBean.xml");
App app = (App)applicationContext.getBean("app");
app.say();

}
}



说明:项目目录如下:其中MyApp类是和App类类似可以不用管。

进入spring源码--debug调试

首先我们要从main入口开始,进入ClassPathXmlApplicationContext类,如图:

然后进入到如下如代码部分:

调用自己的构造函数,传入configLocation配置文件信息,此处configLocation=SpringBean.xml,一个refresh参数为true,还一个空的上下文对象,然后进入:

这是refresh参数用到了,进入if逻辑,调用一个refresh方法,在此之前setConfigLocations主要是加载Spring配置文件的位置。下面是refresh方法代码如下:

其中,核心方法this.obtainFreshBeanFactory(),进入到这个方法代码如下:

主要有两个方法this.refreshBeanFactory()和this.getBeanFactory(),其中refreshBeanFactory()代码如下:

总的来说ClassPathXmlApplicationContext 这种形式的Spring配置文件的加载主要是下面的过程:



A:加载配置文件名到系统配置



B:销毁已有的Beans和BeanFactory



C:创建新的BeanFactory



D:加载Beans,分析Bean中的节点,然后加载到BeanFactory,BeanFactory生效。



发布于: 2020 年 07 月 01 日 阅读数: 61
用户头像

彭阿三

关注

java工程师 2019.06.28 加入

一个慵懒的程序员。

评论

发布
暂无评论
Spring源码梳理(一)之ClassPathXmlApplicationContext