参考视频:2021最新版Spring源码全家桶教程305集IDEA版通俗易懂——B站最全阿里P8级别的Spring源码架构师教程+mybatis源码精讲_哔哩哔哩_bilibili
关于Spring框架的介绍,网上有很多非常好的详细的文章,个人能力有限,只能使用博客记录一下自己目前了解的知识点了!有错误,欢迎指正!
本篇博客将大致介绍一下Spring框架的简单运行流程。
SpringIOC的流程大致如下:
1、先进行BeanFactory的创建
2、将xml中的信息通过BeanDefinitionReader读入到BeanDefinition中
3、经过一些处理
4、由BeanFactory来进行实例化
5、填充属性,比如Name,id
6、初始化
7、完成
示例代码
Users.java
package com.piao.pojo;
public class Users {
private int id;
private String name;
@Override
public String toString() {
return "Users{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
public Users() {
}
public Users(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
applicationContext.xml
<?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="user" class="com.piao.pojo.Users">
<property name="id" value="12"/>
<property name="name" value="mike"/>
</bean>
</beans>
测试代码
@Test
public void test(){
ClassPathXmlApplicationContext con = new ClassPathXmlApplicationContext("applicationContext.xml");
Users user = con.getBean("user", Users.class);
System.out.println(user);
}
流程分析
为什么没进入ClassPathXmlApplicationContext类呢?原因如下:
因为上图的继承关系可知,在实现ClassPathXmlApplicationContext之前,会先实现其父类中由static标识的静态方法块以及初始化父类静态的属性;
结束后,就会进入到ClassPathXmlApplicationContext的构造方法中
上图中的refresh方法 算是最关键的一步,因为很多属性的初始化以及BeanFactory的构建、前期准备工作等都是从这个方法里面调用的。
言归正传,让我们一步步来探究,
super(parent),会调用父类的构造方法中间没有什么操作,就不一一展示了,直接进入
在调用空参构造器之前会先初始化所有的成员变量 。
然后就是
setConfigLocations(configLocations)
其实就可以理解为一种初始化,明白只是给该类的成员变量赋值就行了,里面包含的东西对整个流程没有影响,刚开始没必要深究太多,不然会很迷糊的,我们得先学会先广度,再深度,所有就不过多解释了,
然后就是
refresh():重点
prepareRefresh()
obtainFreshBeanFactory()
当没运行这个方法是,BeanFactory还是空值
1,2表示的是我们的bean信息,后面的思路都是围绕这个展看,看什么时候会注入
继续运行
当执行完loadBeanDefinitions()后,就会获取到我们在bean标签内的内容
prepareBeanFactory():配置工厂的标准上下文特征,例如上下文的类加载器和后处理器。
Bean实例的创建工作
由于知道Bean实例是由BeanFactory通过反射机制创建的,因此,其他细节就不再深究
到此Bean已经实例化成功
IOC差不多就这样了
愁也一天,苦也一天,何不学习每一天