Springboot启动流程、自动装配及starter详解

一、Springboot启动流程?

启动过程涉及两部分,一是创建SpringApplication对象,二是由该对象调用run()方法。
I、创建SpringApplication对象

  1. 从main()方法执行SpringApplication的run()方法,首先new一个SpringApplication对象;
  2. 创建对象时,构造函数主要做了4件事,分别是:
    (1)webApplicationType确定应用程序的启动类型:REACTIVE(响应式)、NONE(不嵌入web容器启动)、SERVLET(基于web容器启动);
    (2)ApplicationContextInitializer加载所有的初始化器;
    (3)ApplicationListener加载所有的监听器;
    (4)mainApplicationClass设置当前程序运行的主类;

II、SpringApplication对象调用run()方法

  1. SpringApplicationRunListeners获取应用监听器,启动监听;
  2. ConfigurableEnvironment加载Springboot配置环境,然后把配置环境environment添加到监听对象中;
  3. ConfigurableApplicationContext加载应用程序上下文,作为run()方法的返回对象;
  4. refreshContext(context)(刷新上下文)创建Spring容器,实现自动配置和Bean的实例化等工作;
  5. listeners.started()发布上下文准备就绪事件,告诉应用程序,已准备好开始工作。

二、Springboot自动装配?

Springboot的核心注解是@SpringbootApplication,该注解由@SpringbootConfiguration@ComponentScan@EnableAutoConfiguration三个注解组成,共同配合完成自动装配。

  1. @SpringbootConfiguration:负责将启动类标记为配置类;
  2. @ComponentScan:负责启动时扫描配置类所在包及其子包中被标记为Bean的类,由IOC容器注册为Bean;
  3. @EnableAutoConfiguration:自动装配核心注解,其中通过@Import注解导入了AutoConfigurationImportSelector类,该类中的selectImports()方法读取类路径的META-INF/spring.factories文件中配置的类全名,通过一定规则排除过滤掉不符合要求的,将剩下符合要求的类全名集合返回给IOC容器,实现自动装配。

三、Springboot中的starter是什么?

  • overstackflow上有人做过总结:Springboot starter就像是启动器,这个启动器会自动依赖其他组件,一站式获取项目需要的与Spring有关的组件,不需要到处找示例代码或是复制相关依赖。
  • 如果在项目中使用Spring+SpringMVC开发时,需要引入Mybatis框架,传统的需要在xml中定义需要的Bean对象,这一过程十分麻烦,而在Springboot中直接添加mybatis-spring-boot-starter依赖即可。
  • 我认为starter就是一个jar包,写一个@Configuration配置类,在其中定义需要的Bean,再在starter包的META-INF/spring.factories文件中写入该配置类,那么Springboot启动时就会按照约定来加载该配置类;开发者只需要在项目中添加这一starter的依赖,进行相关的属性配置,就可以开始程序开发。
  • 官方维护的starter以spring-boot-starter为前缀,第三方维护的starter以spring-boot-starter为后缀。
  • starter的工作原理:
    (1)Springboot启动时会去依赖的starter包中读取META-INF/spring.factories文件;
    (2)根据spring.factories文件配置加载AutoConfigure类;
    (3)根据@Conditional注解的条件,将符合条件的Bean注入IOC容器,进行自动装配。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值