框架 - Spring 源码一步步深入

Posted 袁江南

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了框架 - Spring 源码一步步深入相关的知识,希望对你有一定的参考价值。

引文

很多人都想看spring源码,但是spring模块太多了,翻开一开头皮发麻,然后就放弃了,这里我带领大家一起看spring源码,推荐从ioc看起,spring ioc源码怎么看?我们一定要先找到一个头,最简单的办法就搞个demo,一层一层点进去看。

spring 模块

spring-aop
spring-aspects
spring-beans
spring-context
spring-context-indexer
spring-context-support
spring-core
spring-expression
spring-instrument
spring-jcl
spring-jdbc
spring-jms
spring-messaging
spring-orm
spring-oxm
spring-test
spring-tx
spring-web
spring-webflux
spring-webmvc
spring-websocket

先从最基本的spring ioc开始,我们先建一个简单demo
接口

public interface UserService {
    /** 方法 */
    void show();
}

实现

public class UserServiceImpl implements UserService {
    @Override
    public void show() {
        System.out.println("UserServiceImpl - show");
    }
}

Spring配置

路径:resources/application.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="userService" class="com.user.impl.UserServiceImpl"/>
</beans>

测试类

public class TestMain {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:application.xml");
        UserService userService = context.getBean(UserService.class);
        userService.show();
    }
}

这里使用ClassPathXmlApplicationContext来启动ioc容器,我们比较关心它主要做了什么事。ClassPathXmlApplicationContext在初始化时,先初始父类,然后调用父类refresh()方法,refresh()中有一系列操作
正常
1、prepareRefresh(); 准备工作
2、obtainFreshBeanFactory(); 解析配置文件组装bean定义
3、prepareBeanFactory(beanFactory); 设置BeanFactory的类加载器
4、postProcessBeanFactory(beanFactory); 埋点初始化,可以在初始化前做一些操作
5、invokeBeanFactoryPostProcessors(beanFactory); 调用BeanFactoryPostProcessor
6、registerBeanPostProcessors(beanFactory); 注册BeanPostProcessor 的实现类
7、initMessageSource(); 国际化
8、initApplicationEventMulticaster(); 初始化ApplicationContext 的事件广播器
9、onRefresh(); 具体的子类可以在这里初始化一些特殊的 Bean
10、registerListeners(); 注册事件监听器
11、finishBeanFactoryInitialization(beanFactory); 初始化所有的beans(lazy-init 的除外)
12、finishRefresh(); 广播事件,ApplicationContext初始化完成

异常
1、destroyBeans(); 销毁已经初始化的Beans
2、cancelRefresh(ex); 设置活动标志false

最后
resetCommonCaches(); 清理缓存

后面章节我们详细讲解所有类和方法

以上是关于框架 - Spring 源码一步步深入的主要内容,如果未能解决你的问题,请参考以下文章

一步步剖析spring bean生命周期

深入springboot原理——一步步分析springboot启动机制(starter机制)

深入springboot原理——一步步分析springboot启动机制(starter机制)

深入springboot原理——一步步分析springboot启动机制(starter机制)

一步步去阅读koa源码,整体架构分析

SSH进阶之路一步步重构容器实现Spring框架——彻底封装,实现简单灵活的Spring框架