spring源码梳理(一 )

我们了解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生效。

 

版权声明: 本文为 InfoQ 作者【彭阿三】的原创文章。

原文链接:【https://xie.infoq.cn/article/440bdb97a6c4d522fd10aa52b】。

本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。

个人公众号 :

 

 

 

 

 

posted @ 2020-07-02 09:40  彭阿三  阅读(185)  评论(0编辑  收藏  举报