携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情
Spring框架现如今作为大部分项目的基底,了解其核心源码以及执行流程,有利于我们对项目中出现的问题进行及时的定位并解决。本次使用的Spring版本为5.2.20.BUILD-SNAPSHOT
一、Spring中核心方法
Spring中核心的方法在AbstractApplicationContext的refresh()中的12个方法,如图
简单说明一下这12个方法
prepareRefresh()
该方法主要用于容器刷新前的准备,包括开启时间计时器,获取属性,验证必要的属性等工作。
obtainFreshBeanFactory()
该方法主要作用为获取新的Bean工厂,并刷新Bean工厂,并且返回这个BeanFactory。如果是基于xml配置的启动方式,会在其内部进行对xml配置文件的读取及解析,生成相应的BeanDefinition
postProcessBeanFactory(beanFactory)
BeanFactory的预备工作,对beanFactory进行标准的配置,设置 ClassLoader等内容,添加忽略注入的接口,添加 bean ,添加 bean 后置处理器等。
postProcessBeanFactory(beanFactory)
BeanFactory准备工作完成后进行的后置处理工作,所有的BeanDefinition已经被加载,但是还没有被实例化,允许在子类中对beanFactory进行扩展操作。
invokeBeanFactoryPostProcessors(beanFactory)
执行BeanFactoryPostProcessor的方法
registerBeanPostProcessors(beanFactory)
注册BeanPostProcessor(Bean的后置处理器),在创建bean的前后等执行
initMessageSource()
与国际化相关
initApplicationEventMulticaster()
初始化事件广播器
onRefresh()
这个方法默认是一个空实现,模板方法,在bean实例化之前可以加载特殊的bean的初始化
registerListeners()
注册监听器
finishBeanFactoryInitialization(beanFactory)
完成bean的初始化操作,在这个方法中会将beanDefinitionNames中的bean进行实例化操作,属于bean加载中的主要方法
finishRefresh()
完成Spring的启动,该方法中主要做清除上下文缓存、初始化上下文的生命周期处理器,并刷新、发布事件等内容
二、Spring启动Demo
准备一个对象Bean,以加载当前Bean对象演示Spring的启动流程
package com.spring;
public class Bean
{
private String name;
private Integer age;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Integer getAge() { return age; }
public void setAge(Integer age) { this.age = age; }
}
准备配置文件text.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"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
<bean class="com.spring.Bean" id="bean">
<property name="name" value="张三"></property>
<property name="age" value="12"></property>
</bean>
</beans>
准备启动文件类
package com.spring;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("text.xml");
Bean bean = context.getBean(Bean.class);
System.out.println(bean.getName());
System.out.println(bean.getAge());
}
}
启动main 控制台输出
说明spring启动成功并成功将bean进行实例化
三、总结
学习Spring源码,首先要了解Spring中的核心方法,在不断地深入,才能有更深入的了解,后面会逐篇讲解配置文件的解析、Bean的详细加载过程、Spring是怎么解决循环依赖问题以及在项目中遇到循环依赖问题的常见解决方案等。