首页 > 其他分享 >SpringBoot启动流程

SpringBoot启动流程

时间:2022-12-17 11:56:18浏览次数:46  
标签:SpringBoot 启动 流程 bean class listeners context Configuration public

1. 简述

Springboot启动是通过Application启动类实现

@SpringBootApplication(
    exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class},
    scanBasePackages = {"com.citi.xip.market.data"})
@EnableCaching
public class DataApplication {
  public static void main(String[] args) {
    SpringApplication.run(DataApplication.class); 
  }
}

springboot启动分为注解和启动方法两个过程

2. @SpringBootApplicaiton注解

进入@SpringBootApplication注解内,可见@SpringBootApplication=@SpringCofiguration+@EnableConfiguration+@ComponentScan

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {...}

2.1 @SpringBootConfiguration

进入@SpringBootConfiguration注解内如下,可见@SpringBootConfiguration本身也是一种配置(@Configuration)

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
@Indexed
public @interface SpringBootConfiguration {

@Configuration的作用(定义一些可以被自动加载IOC容器的配置bean):

@Configuration标注在类上,配置spring容器(应用上下文)。进入@Configuration注解里使用@Component,返回类型都会直接注册为bean(任何一个标注了@Bean的方法,其返回值都将作为一个bean定义注册到Spring的IOC容器),所以@Configuration具有和@Component作用,因此@CompoenntScan都能处理@Configuration注解的类

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {...}

 

demo如下,使用@Configuration可以将配置文件中配置信息(比如下例中启动环境env 邮件收件人 emailTo等)作为元素组成的bean,在spring启动时自动注入到IOC容器中。

@Configuration
@Data
public class EmailConfig {

  @Value("${spring.profiles.active}")
  public String env;

  @Value("${email.to}")
  public String emailTo;

  @Value("${email.from}")
  public String emailFrom;
}

 

 

 

2.2 @EnableAutoConfiguration(开启自动配置)

进入@EnableAutoConfiguration如下,使用@Import将所有满足条件的bean自动加载到IOC容器

 

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {...}

 

 

2.3 @ComponentScan(开启自动自动扫描)

 自动扫描并加载符合条件的组件或者bean定义。默认扫描SpringApplication的run方法里class所有的包路径下文件

 

3.启动方法 .run() 

启动方法分为创建springApplicaiton实例和执行run方法

3.1创建SpringApplication实例

SpringApplication实例创建过程如下图所示。

 

 

3.2 执行run()方法

包括环境准备、创建IOC容器、配置IOC容器基本信息、刷新上下文信息等。具体查看参考文献1

public ConfigurableApplicationContext run(String... args) {
        long startTime = System.nanoTime();
        DefaultBootstrapContext bootstrapContext = createBootstrapContext();
        ConfigurableApplicationContext context = null;
        configureHeadlessProperty();
        SpringApplicationRunListeners listeners = getRunListeners(args);
        listeners.starting(bootstrapContext, this.mainApplicationClass);
        try {
            ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
            ConfigurableEnvironment environment = prepareEnvironment(listeners, bootstrapContext, applicationArguments);
            configureIgnoreBeanInfo(environment);
            Banner printedBanner = printBanner(environment);
            context = createApplicationContext();
            context.setApplicationStartup(this.applicationStartup);
            prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);
            refreshContext(context);
            afterRefresh(context, applicationArguments);
            Duration timeTakenToStartup = Duration.ofNanos(System.nanoTime() - startTime);
            if (this.logStartupInfo) {
                new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), timeTakenToStartup);
            }
            listeners.started(context, timeTakenToStartup);
            callRunners(context, applicationArguments);
        }
        catch (Throwable ex) {
            handleRunFailure(context, ex, listeners);
            throw new IllegalStateException(ex);
        }
        try {
            Duration timeTakenToReady = Duration.ofNanos(System.nanoTime() - startTime);
            listeners.ready(context, timeTakenToReady);
        }
        catch (Throwable ex) {
            handleRunFailure(context, ex, null);
            throw new IllegalStateException(ex);
        }
        return context;
    }

 

 

参考文献:

https://www.cnblogs.com/taojietaoge/p/16075820.html

https://www.cnblogs.com/dingjiaoyang/p/15513425.html

标签:SpringBoot,启动,流程,bean,class,listeners,context,Configuration,public
From: https://www.cnblogs.com/enhance/p/16988798.html

相关文章

  • 测试按项目流程阶段划分
    按软件项目流程可划分为单元测试、集成测试、系统测试和验收测试四类测试。(1)单元测试UnitTesting是指对软件中的最小可测试单元进行检查和验证。其中单元测......
  • 功能测试用例的编写思路及流程
    功能测试用例的编写需要按照一定的思路进行,而不是想到哪写到哪,一般测试机制成熟的公司都会有公司自己自定义的测试用例模板,以及一整套的测试流程关注点,测试人员在测试......
  • RequestMappingHandlerMapping请求地址映射流程!
    上篇文章里,我们讲解了RequestMappingHandlerMapping请求地址映射的初始化流程,理解了@Controller和@RequestMapping是如何被加载到缓存中的。今天我们来进一步学习,在接收到......
  • java项目启动动画
    http://patorjk.com/software/taag/#p=testall&f=Graffiti&t=study......
  • 数据库设计流程
    对于上图的解读,菱形中是对对象的行为,矩形是大的对象类,有两边的矩形是细分类每两个图形中间都要连线,线上划一圈表示从属关系,表示做,l表示被做,和l一般在菱形两边,......
  • 【SpringBoot】Spring Data Redis封装和Spring Cache
    一、参考资料​​RedisUtil:最全的Java操作Redis的工具类,使用StringRedisTemplate实现,封装了对Redis五种基本类型的各种操作!​​​​SpringCache-简书​​​​redis分布......
  • 1、Git的安装及基本工作流程
    基本的Git工作流程如下:1.在工作目录中修改某些文件。2.对修改后的文件进行快照,然后保存到暂存区域。3.提交更新,将保存在暂存区域的文件快照永久转储到Git目录中。......
  • 【SpringBoot】封装自定义的starter
    一、参考资料​​SpringBoot封装自己的Starter-码农教程​​​​[Gradle]发布构件到本地仓库​​​​Gradle插件之maven-publish:发布androidlibrary到maven仓库-知乎......
  • SpringBoot2.x 优秀开源项目
    前后端分离vue开源项目:项目名开源地址eladmin-web​​https://gitee.com/elunez/eladmin-web​​eladmin​​https://gitee.com/elunez/eladmin​​RuoYi-Vue​​https://gi......
  • oracle数据库startup启动报错ORA-27125 unable to create shared memory segment
    问题描述:oracle数据库startup启动报错ORA-27125unabletocreatesharedmemorysegment,如下所示:系统:suse11.2环境:rac双节点+oracle11.2.0.4说明:节点1数据库正常,节点2......