相信大家使用Spring的时候每次重启都是一个很头疼的问题,随着应用规模越来越大,类越来越多,启动的速度非常慢,下面分享一个通过懒加载的方式让应用加速启动。
Started UserServiceApplication in 38.37 seconds (JVM running for 40.383)
我们目前的应用启动可能要花费接近40秒的样子,每次调试都很头疼,当然可以安装一些Jrebel 的方式热部署,但那个插件有很多乱七八糟的问题。
原理是将所有的bean都设置为Lazy模式,当需要用到的时候,再去加载;
通常的做法是类上加上注解
@Lazy
public class bean{}
但是类那么多,一个个加影响太大了。
BeanDefinitionRegistryPostProcessor
通过BeanDefinitionRegistryPostProcessor
,将所有扫描到容器的类手都设置Lazy属性:
/**
* @author : liukx
* @time : 2020/9/21 - 19:42
*/
public class LayzProcess implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
for (int i = 0; i < registry.getBeanDefinitionNames().length; i++) {
String name = registry.getBeanDefinitionNames()[i];
BeanDefinition beanDefinition = registry.getBeanDefinition(name);
beanDefinition.setLazyInit(true);
}
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
}
}
然后我们希望这个类只在本地开发的时候被启用,其他环境就关闭掉:
@Configuration
public class BeanConfig {
@Profile(value = {"dev"})
public LayzProcess layzProcess(){
return new LayzProcess();
}
}
这里代表的是开发环境application-dev.yml
的配置文件中的属性可以设置为:
spring:
profiles:
active: dev
现在我们看看加了这个注解之后启动速度:
2021-06-24 16:50:27.079 INFO 50612 --- [ main] c.e.m.auth.UserServiceApplication : Started UserServiceApplication in 23.407 seconds (JVM running for 25.236)
这里提升了接近一半的时间样子,也算是一个优化的手段吧。
更主要的目的是当我们遇到类似场景时,可以使用BeanDefinitionRegistryPostProcessor
解决很多问题。
不过需要留意的是如果是懒加载的话,可能会导致一些组件出现警告:
比如swagger的核心组件springfox-schema:
2021-06-24 16:54:27.776 WARN 113864 --- [ main] s.d.s.p.CachingModelPropertiesProvider : Exception calculating properties for model(com.xxx.common.dto.response.ObjectResponseModel<com.xxx.marketing.auth.service.response.QRXXXResponse>) -> ModelContext{groupName=default, type=com.xxx.common.dto.response.ObjectResponseModel<com.xxx.marketing.auth.service.response.QRCodeCreateResponse>, isReturnType=true}. java.lang.NullPointerException
关闭掉LayzProcess就好了,一定要注意喔。
如有问题欢迎留言,我会快速答复。
网友评论