Spring核心IOC加载过程

153 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

Spring 最重要的概念是 IOC 和 AOP,本篇文章其实就是要带领大家来分析下 Spring 的 IOC 容器.

启动示例

下面是一个最基本的启动 Spring 容器的例子,

首先,定义一个接口:

public interface MessageService {
    String getMessage();
}

定义接口实现类:

public class MessageServiceImpl implements MessageService {
 
    public String getMessage() {
        return "hello world";
    }
}

接下来,我们在 resources 目录新建一个配置文件,文件名applicationfile.xml

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" default-autowire="byName">
 
    <bean id="messageService" class="com.javadoop.example.MessageServiceImpl"/>
</beans>

这样我们就可以将ApplicationContext 启动起来了

public static void main(String[] args) {
    ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationfile.xml");
​

启动过程分析

image.png

首先我们看下ClassPathXmlApplicationContext 的源码,可以看到ClassPathXmlApplicationContext 的构造方法

image.png

  • 核心方法就是 refresh(),我们是可以通过调用 refresh() 这个方法重建的,这样会将原来的 ApplicationContext 销毁,然后再重新执行一次初始化操作;

  • refresh方法中调用了许多方法,首先通过prepareRefresh创建 Bean 容器前的准备工作。 ConfigurableListableBeanFactory这里将会初始化 BeanFactory、加载 Bean、注册 Bean,

  • 之后prepareBeanFactory会设置 BeanFactory 的类加载器,添加几个 BeanPostProcessor,手动注册几个特殊的 bean;

  • 调用 BeanFactoryPostProcessor 各个实现类的 postProcessBeanFactory(factory) 方法

  • registerBeanPostProcessors接口两个方法: postProcessBeforeInitialization 和 postProcessAfterInitialization, 两个方法分别在 Bean 初始化之前和初始化之后得到执行。注意,到这里 Bean 还没初始化;

  • 接下来分别初始化当前 ApplicationContext 的 MessageSource和当前 ApplicationContext 的事件广播器,registerListeners:注册事件监听器,监听器需要实现 ApplicationListener 接口,

  • 到这里BeanFactory 已经创建完成,并且所有的实现了 BeanFactoryPostProcessor 接口的 Bean 都已经初始化并且其中的 postProcessBeanFactory(factory) 方法已经得到执行了。所有实现了 BeanPostProcessor 接口的 Bean 也都完成了初始化。

  • 剩下的就是初始化其他还没被初始化的 singleton beans 了,如果没有设置懒加载,那么 Spring 会在接下来初始化所有的 singleton beans。

  • 之后finishBeanFactoryInitialization,这里会负责初始化所有的 singleton beans。

好了,本文就给大家介绍到这里,感觉有帮助的,留下个赞或评论再走吧!谢啦~ 💐