一文读懂SpringBoot启动流程,提升开发效率

科技   2024-10-19 08:36   河北  


前言

在Spring Boot的开发中,了解其启动流程对于提升开发效率和调试能力至关重要。本文将详细解析Spring Boot的启动流程,并给出一些最佳实践,帮助你在实际项目中更高效地使用Spring Boot。

SpringBoot启动流程

Spring Boot的启动流程可以分为几个主要步骤,这些步骤涵盖了从应用程序的入口方法开始,到最终运行嵌入式Web服务器的全过程。

1. SpringApplication对象的创建

Spring Boot的启动从main方法开始。在main方法中,首先会运行SpringApplication.run(...)静态方法,创建一个SpringApplication对象,并调用其run方法。SpringApplication的构造函数中完成了许多初始化配置工作。

  • 读取配置文件:通过类加载器读取classpath下所有的spring.factories配置文件,创建一些初始化配置对象。

  • 通知监听器:通知应用程序启动开始,并创建环境对象environment,用于读取环境配置,如application.yml


  • public static ConfigurableApplicationContext run(Object[] sources, String[] args) { 
        // 创建SpringApplication对象
        SpringApplication app = new SpringApplication(sources);
        // 运行SpringApplication对象
        return app.run(args);
    }
2. 创建应用程序上下文

SpringApplication对象的run方法中,会创建应用程序上下文(ApplicationContext)。

  • 创建ApplicationContext:根据项目的类型(如Servlet项目),创建适合的ApplicationContext对象,如AnnotationConfigServletWebServerApplicationContext

  • 准备ApplicationContext:保存环境信息,执行IOC容器的后置处理流程,应用初始化器等。


  • public ConfigurableApplicationContext run(String... args) { 
        // 创建ApplicationContext
        ApplicationContext context = createApplicationContext();
        // 准备ApplicationContext
        prepareContext(context, environment, listeners, applicationArguments, printedBanner);
        // 刷新ApplicationContext
        refreshContext(context);
        // 其他操作...
        return context;
    }
3. 刷新上下文(启动核心)

刷新上下文是Spring Boot启动流程中的核心部分,它负责完成Spring容器的初始化工作,包括配置对象、bean的定义、实例化等。

  • 配置工厂对象:包括上下文类加载器、对象发布处理器、BeanFactoryPostProcessor等。

  • 注册并实例化bean工厂发布处理器:调用这些处理器对包扫描(主要是class文件)进行注册和实例化。

  • 注册并实例化bean发布处理器BeanPostProcessor

  • 初始化一些与上下文有特别关系的bean对象:如创建Tomcat服务器。

  • 实例化所有bean:缓存的bean对象进行实例化。

  • 发布通知:上下文刷新完成,启动Tomcat服务器。


  • private void refreshContext(ConfigurableApplicationContext context) { 
        // 配置工厂对象
        configureBeanFactory(context.getBeanFactory());
        // 注册并实例化bean工厂发布处理器
        context.getBeanFactory().preInstantiateSingletons();
        // 其他操作...
        // 通知监听器上下文刷新完成
        publishEvent(new ContextRefreshedEvent(context));
    }
4. 通知监听者——启动程序完成

在刷新上下文完成后,Spring Boot会通知所有的监听者,表示应用程序启动完成。

  • 获取所有监听器:从Spring.factories文件中获取所有的SpringApplicationRunListener

  • 调用监听器方法:调用监听器的started方法,表示项目已经启动。

  • 运行runner:获取容器中的ApplicationRunnerCommandLineRunner,并按顺序执行它们的run方法。


  • private void callRunners(ApplicationContext context, ApplicationArguments args) { 
        List<ApplicationRunner> runners = new ArrayList<>(context.getBeansOfType(ApplicationRunner.class).values());
        List<CommandLineRunner> commandLineRunners = new ArrayList<>(context.getBeansOfType(CommandLineRunner.class).values());
        // 合并runner并按顺序执行
        // ...
    }


最佳实践

在了解了Spring Boot的启动流程后,我们可以结合一些最佳实践,来提升开发效率。

1. 使用Spring Initializr创建项目

Spring Initializr提供了一个简单的方法来创建新的Spring Boot项目,并根据需要加载可能使用的依赖。使用Initializr创建应用程序可以确保你获得经过测试和验证的依赖项,这些依赖项适用于Spring自动配置。

curl https://start.spring.io/starter.zip -d dependencies=web,data-jpa -d baseDir=myproject -o myproject.zip
2. 维护第三方依赖版本

Spring Boot项目本身使用和集成了大量的开源项目,维护这些第三方依赖版本可能会非常繁琐。你可以借鉴Spring IO Platform来编写自己的基础项目BOM(Bill of Materials),所有的业务模块项目应该以BOM的方式引入。这样在升级第三方依赖时,只需要升级这一个依赖的版本。

<dependencyManagement>  
    <dependencies>  
        <dependency>  
            <groupId>io.spring.platform</groupId>  
            <artifactId>platform-bom</artifactId>  
            <version>Cairo-SR3</version>  
            <type>pom</type>  
            <scope>import</scope>  
        </dependency>  
    </dependencies>  
</dependencyManagement>
3. 使用自动配置

Spring Boot的一个主要特性是使用自动配置,它可以简化你的代码并使之工作。当在类路径上检测到特定的jar文件时,自动配置就会被激活。使用它的最简单方法是依赖Spring Boot Starters。

<dependency>  
    <groupId>org.springframework.boot</groupId>  
    <artifactId>spring-boot-starter-data-redis</artifactId>  
</dependency>
4. 排除自动配置

虽然自动配置很方便,但在某些情况下,你可能需要从自动配置中排除某些配置类。可以使用@EnableAutoConfiguration注解的exclude属性来实现。

@SpringBootApplication  
@EnableAutoConfiguration(exclude = {ClassNotToAutoconfigure.class})
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

总结

通过了解Spring Boot的启动流程,我们可以更好地掌握其内部工作机制,从而在实际开发中更加高效地使用它。结合一些最佳实践,如使用Spring Initializr创建项目、维护第三方依赖版本、使用自动配置等,可以进一步提升开发效率。希望本文能够帮助你在Spring Boot开发的道路上更加顺利,更快速地构建出优质的应用程序。




Java技术前沿
专注分享Java技术,包括但不限于 SpringBoot,SpringCloud,Docker,消息中间件等。
 最新文章