关于Spring boot项目启动过程分析

玉官
• 阅读 2924

SpringBoot 项目启动分析

启动入口

SpringBoot 工程中由SpringBootApplication注解描述的类为启动入口类,例如:

package com.cy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {//Application.class
  public static void main(String[] args) {//Main Thread
    SpringApplication.run(Application.class, args);
  }
}

启动过程概要分析

SpringBoot工程启动时其简易初始化过程,如图所示:

关于Spring boot项目启动过程分析

在启动过程中底层做了哪些事情,大致描述如下:
1)基于配置加载类(通过ClassLoader将指定位置的类读到内存->底层通过线程调用IO从磁盘读取到内存)。
2)对类进行分析(创建字节码对象-Class类型,通过反射获取器配置信息)。
3)对于指定配置(例如由spring特定注解描述)的对象存储其配置信息(借助BeanDefinition对象存储)。
4)基于BeanDefinition对象中class的配置构建类的实例(Bean对象),并进行bean对象的管理(可能会存储到bean池)。

spring boot项目启动过程中,首先通过@SpringBootApplication注解下的main方法启动,然后spring boot通过线程和IO把磁盘中的Java基础类,springboot内部类以及与main方法同一个包下及其子包的类加载到内存中,通过对Bean的注解和配置信息分析,将Bean的配置信息存到spring的Bean配置信息容器中,由于spring是一个整合对象资源和创建对象资源的框架,所以spring会基于Bean配置信息容器中的信息,在工厂BeanFactory创建Bean实例对象,并将其存储到spring的Bean实例对象容器中以备使用,BeanPool就类似于线程池,将Bean实例对象使用完后依然会回到BeanPool中方便多次循环利用。

点赞
收藏
评论区
推荐文章
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Wesley13 Wesley13
4年前
VBox 启动虚拟机失败
在Vbox(5.0.8版本)启动Ubuntu的虚拟机时,遇到错误信息:NtCreateFile(\\Device\\VBoxDrvStub)failed:0xc000000034STATUS\_OBJECT\_NAME\_NOT\_FOUND(0retries) (rc101)Makesurethekern
Stella981 Stella981
4年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Easter79 Easter79
4年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Easter79 Easter79
4年前
SpringBoot学习(五)
SpringBoot的核心1、入口类和@SpringBootApplicationSpringBoot的项目一般都会有\Application的入口类,入口类中会有main方法,这是一个标准的Java应用程序的入口方法。而@SpringBootApplication注解是SpringBoot的核心
Easter79 Easter79
4年前
SpringBoot的启动引导类真的是XXApplication吗?
1\.引言SpringBoot项目中的启动类,一般都是XXApplication,例如StatsApplication,UnionApplication。每个项目的启动类名称都不一样。但是它的启动类真的是XXApplication吗?!(https://oscimg.oschina.net/oscnet/up1a
Stella981 Stella981
4年前
SpringBoot的启动引导类真的是XXApplication吗?
1\.引言SpringBoot项目中的启动类,一般都是XXApplication,例如StatsApplication,UnionApplication。每个项目的启动类名称都不一样。但是它的启动类真的是XXApplication吗?!(https://oscimg.oschina.net/oscnet/up1a
Stella981 Stella981
4年前
SpringBoot学习(五)
SpringBoot的核心1、入口类和@SpringBootApplicationSpringBoot的项目一般都会有\Application的入口类,入口类中会有main方法,这是一个标准的Java应用程序的入口方法。而@SpringBootApplication注解是SpringBoot的核心
Stella981 Stella981
4年前
SpringBoot 核心配置
1\.入口类和@SpringBootApplication  SpringBoot的项目一般都会有\Application的入口类,入口类中会有main方法,这是一个标准的Java应用程序的入口方法。  @SpringBootApplication注解是SpringBoot的核心注解,它其实是一个组合注解:  !(https
Stella981 Stella981
4年前
C++笔记002:VS2010报错:LINK fatal error LNK1123 转换到 COFF 期间失败文件无效或损坏
 原创笔记,转载请注明出处!点击【关注】,关注也是一种美德~错误描述:1已启动生成:项目:FirstCode,配置:DebugWin321生成启动时间为2018/2/521:00:30。1InitializeBuildStatus:1 正在