spring构造方法注入多个参数 springboot构造方法注入_spring


java的web开发离不开spring,就像西方不能没有耶路撒冷。作为一名java程序员,不了解spring的底层逻辑实在有失水准,编程学习既要知其然,也要知其所以然,借此机会分享下自己学习源码的过程。

参考源码:<spring.boot.version>2.3.12.RELEASE</spring.boot.version>

目录

1、SpringApplication对象的构造方法

2、总结

先来看看启动程序的组成部分:

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

1、@SpringBootApplication

2、SpringApplication.run(Application.class, args)

通俗来讲,@SpringBootApplication指明哪些bean是自动配置的,SpringApplication.run(Application.class, args)负责初始化那些交给spring托管的bean。我们从核心语句出发,看看它们的功能是怎样实现的

点击进入run方法查看源码



spring构造方法注入多个参数 springboot构造方法注入_java_02


run方法重载调用了另一个run方法



spring构造方法注入多个参数 springboot构造方法注入_spring_03


run方法内new了一个SpringApplication对象,并且调用了这个对象的run方法,我们分两步来看,一个是SpringApplication对象的构造方法,另一个是SpringApplication对象的run方法,这一章我们主要分析SpringApplication对象的构造方法

1、SpringApplication对象的构造方法



spring构造方法注入多个参数 springboot构造方法注入_后端_04


SpringApplication对象的构造方法初始化了很多成员变量,我们重点关注设置初始化类和监听器的两个set方法,这两个set方法都调用了getSpringFactoriesInstances方法

调用链:
getSpringFactoriesInstances 
-> loadFactoryNames 
-> loadSpringFactories

spring构造方法注入多个参数 springboot构造方法注入_java_05




spring构造方法注入多个参数 springboot构造方法注入_spring boot_06



spring构造方法注入多个参数 springboot构造方法注入_spring构造方法注入多个参数_07

loadSpringFactories方法会加载classPath下所有的META-INF/spring.factories文件,从文件中获取符合类型要求的类的全限定类名

spring构造方法注入多个参数 springboot构造方法注入_spring构造方法注入多个参数_08

拿到全限定名后,createSpringFactoriesInstances方法通过反射将这些初始化类或监听器实例化,到这里创建SpringApplication对象结束



spring构造方法注入多个参数 springboot构造方法注入_java_09


2、总结

SpringApplication的构造器初始化了很多成员变量,并且拿到了初始化上下文环境相关的类,这些初始化类会在后续的prepareContext方法中用到

SpringApplication对象创建好了,下一章我们分析SpringApplication对象的run方法