Spring-Boot-Launch-Acceleration
干货分享,感谢您的阅读!
随着微服务架构的普及,SpringBoot 已成为构建高效、可扩展的应用程序的首选框架之一。然而,SpringBoot 作为一个全功能框架,虽然提供了丰富的特性和便捷的开发体验,但在启动速度上,尤其是对于大规模应用,往往表现不尽如人意。启动时间过长不仅影响开发效率,还可能影响生产环境中系统的响应速度,甚至在某些情况下影响用户体验。
为了应对这一问题,许多开发者开始寻求 SpringBoot 启动优化 的解决方案,力求在保证应用功能的同时,最大程度地减少启动延迟。本文将深入探讨如何通过 干预与优化 两大策略,帮助开发者加速 SpringBoot 应用的启动时间。我们将从实际应用角度出发,介绍一系列行之有效的优化方法,并提供可操作性的指导,助力开发者提升 SpringBoot 启动效率,从而在大规模分布式环境中保持高效的开发和运行。
无论你是初次接触 SpringBoot,还是已经有一定经验的开发者,本文的内容都将为你提供重要的实践价值,帮助你在现代应用开发中实现更优的性能和用户体验。
一、SpringBoot启动配置原理简述
本内容直接查看分析SpringBoot启动配置原理_单块系统_张彦峰ZYF的博客对应详细讲解。因为本期的各种优化干预手段都依赖其基本原理,建议在使用前进行阅读。
二、SpringBoot启动过程干预
Spring Boot启动过程中我们可以实现以下干预工作:
-
修改Spring Boot默认的配置属性。使用
@ConfigurationProperties和@EnableConfigurationProperties注解,可以获取和修改Spring Boot的配置属性。 -
加载配置文件。Spring Boot会自动加载
application.properties或application.yml等配置文件,我们可以在启动时加载其他配置文件。 -
自定义bean。我们可以通过
@Component注解创建自定义的bean以及其他的@SpringBootAnnotation注解,来实现更灵活的配置和自动化初始化。 -
执行一些初始化逻辑。我们可以对应用程序的数据库、缓存、MQ等进行初始化,例如创建数据源、初始化缓存等,以确保应用程序正常运行,并且可以通过
ApplicationRunner和CommandLineRunner等干预代码的方式执行这些初始化逻辑。 -
执行一些后置操作。在Spring Boot应用程序停止后执行一些清理工作,例如关闭数据源、释放缓存等。
这些干预步骤可以在Spring Boot应用程序启动和停止完成后进行,从而实现更灵活的配置和初始化。
(一)ApplicationContextInitializer扩展
通过实现ApplicationContextInitializer接口,我们可以在ApplicationContext创建之前对其进行一些定制化的修改。这个接口定义了一个initialize方法,接受一个ConfigurableApplicationContext对象作为参数,我们可以在这个方法中对这个对象进行修改和配置。
可以通过ApplicationContextInitializer实现以下扩展任务:
-
修改Spring Boot默认的environment属性。使用
configurableApplicationContext.getEnvironment()方法获取到environment对象,从而修改环境变量,例如添加自定义配置文件路径。 -
添加自定义的PropertySource。使用
environment.getPropertySources().addLast(propertySource)方法,可以添加自定义的属性源,从而实现更灵活的配置。 -
注册自定义bean。使用
configurableApplicationContext.getBeanFactory().registerSingleton(beanName, bean)方法,可以注册自定义的bean,从而实现更灵活的依赖注入。
可以添加自定义的ApplicationContextInitializer实现类,从而扩展应用程序的初始化逻辑。通过实现ApplicationContextInitializer接口,可以在Spring Boot应用程序启动之前对应用程序进行一些初始化定制化的操作,从而满足开发者对应用程序的特殊需求。
修改Spring Boot默认的environment属性
修改Spring Boot默认的environment属性,例如添加自定义配置文件路径,可以通过实现ApplicationContextInitializer接口来完成。
package org.zyf.javabasic.springextend.runext;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.support.ResourcePropertySource;
import java.io.IOException;
/**
* @author yanfengzhang
* @description 修改Spring Boot默认的environment属性。使用configurableApplicationContext.getEnvironment()方法获取到environment对象,从而修改环境变量,例如添加自定义配置文件路径。
* @date 2021/2/23 23:48
*/
public class InterveneApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
ConfigurableEnvironment environment = configurableApplicationContext.getEnvironment();
// 添加自定义配置文件路径
try {
ObjectMapper objectMapper = new ObjectMapper();
System.out.println("InterveneApplicationContextInitializer initialize :" + configurableApplicationContext);
environment.getPropertySources().addFirst(new ResourcePropertySource("classpath:zyftest.properties"));
System.out.println("InterveneApplicationContextInitializer initialize add FirstResourcePropertySource classpath:zyftest.properties");
} catch (IOException e) {
e.printStackTrace();
}
}
}
在上面的代码中,我们通过getEnvironment()方法获取到ConfigurableEnvironment对象,然后通过getPropertySources()方法获取到属性源,使用addFirst()方法将自定义的custom.properties文件的PropertySource添加到属性源的首位。这样,在应用程序启动时,就会首先加载custom.properties文件,从而实现了自定义的配置。
需要注意的是,上述代码中的InterveneApplicationContextInitializer需要被注册才能生效。可以通过在src/main/resources/META-INF/spring.factories文件中指定注册项的方式来注册:
org.springframework.context.ApplicationContextInitializer=
org.zyf.javabasic.springextend.runext.InterveneApplicationContextInitializer