启动缓慢
西魏陶渊明 ... 2022-3-24 小于 1 分钟
启动缓慢分析
当应用中拥有大对象,可能会导致单侧启动比较慢,针对这种问题有不同的解决方案
# SpringBoot 2.2 解决方案
spring.main.lazy-initialization = true
1
SpringApplication 会自动添加一个叫 LazyInitializationBeanFactoryPostProcessor
的处理器
# SpringBoot 2.2 以前
给应用上下文提前装载一个类似的处理器,然后通过 BeanFactoryPostProcessor
在容器刷新前循环将 BeanDefinition
声明懒加载
public class BeanLazyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
applicationContext.addBeanFactoryPostProcessor(new LazyBeanDefinitionPostProcessor());
}
public static class LazyBeanDefinitionPostProcessor implements BeanFactoryPostProcessor, Ordered {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
for (String beanName : beanFactory.getBeanDefinitionNames()) {
BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName);
if (beanDefinition instanceof AbstractBeanDefinition) {
beanDefinition.setLazyInit(true);
}
}
}
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
测试引导类配置变更
- @ContextConfiguration 通过容器初始化去新增处理器
- @ActiveProfiles 指定测试环境激活的配置是local
@ContextConfiguration添加处理器
@Slf4j
@ActiveProfiles({"local"})
@ContextConfiguration(initializers = {BeanLazyApplicationContextInitializer.class})
// 使用Spring容器引导
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {CenterProviderApplication.class}) // 指定启动类
public class BaseApplicationTest {
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 如何确定版本?
Idea
中搜索 @SpringApplication
查看所在的包
本文由西魏陶渊明版权所有。如若转载,请注明出处:西魏陶渊明