项目概况

启动缓慢

2026-01-291 min read未分类
场景分析

!!!info 启动缓慢分析

当应用中拥有大对象,可能会导致单侧启动比较慢,针对这种问题有不同的解决方案

!!!

SpringBoot 2.2 解决方案

text
1spring.main.lazy-initialization = true

SpringApplication 会自动添加一个叫 LazyInitializationBeanFactoryPostProcessor的处理器

SpringBoot 2.2 以前

给应用上下文提前装载一个类似的处理器,然后通过 BeanFactoryPostProcessor 在容器刷新前循环将 BeanDefinition 声明懒加载

java
1public class BeanLazyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> { 2 3 @Override 4 public void initialize(ConfigurableApplicationContext applicationContext) { 5 applicationContext.addBeanFactoryPostProcessor(new LazyBeanDefinitionPostProcessor()); 6 } 7 8 public static class LazyBeanDefinitionPostProcessor implements BeanFactoryPostProcessor, Ordered { 9 10 @Override 11 public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { 12 for (String beanName : beanFactory.getBeanDefinitionNames()) { 13 BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName); 14 if (beanDefinition instanceof AbstractBeanDefinition) { 15 beanDefinition.setLazyInit(true); 16 } 17 } 18 } 19 20 @Override 21 public int getOrder() { 22 return Ordered.HIGHEST_PRECEDENCE; 23 } 24 } 25 26}

!!!tip 测试引导类配置变更

  • @ContextConfiguration 通过容器初始化去新增处理器
  • @ActiveProfiles 指定测试环境激活的配置是local !!!

@ContextConfiguration添加处理器

java
1@Slf4j 2@ActiveProfiles({"local"}) 3@ContextConfiguration(initializers = {BeanLazyApplicationContextInitializer.class}) 4// 使用Spring容器引导 5@RunWith(SpringRunner.class) 6@SpringBootTest(classes = {CenterProviderApplication.class}) // 指定启动类 7public class BaseApplicationTest { 8 9}

如何确定版本?

Idea 中搜索 @SpringApplication 查看所在的包