启动缓慢
场景分析
!!!info 启动缓慢分析
当应用中拥有大对象,可能会导致单侧启动比较慢,针对这种问题有不同的解决方案
!!!
SpringBoot 2.2 解决方案
text
1spring.main.lazy-initialization = trueSpringApplication 会自动添加一个叫 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 查看所在的包
