SpringBoot小技巧之启动加速

相信大家使用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) -> ModelContext{groupName=default, type=com.xxx.common.dto.response.ObjectResponseModel, isReturnType=true}. java.lang.NullPointerException

关闭掉LayzProcess就好了,一定要注意喔。

如有问题欢迎留言,我会快速答复。

你可能感兴趣的:(小技巧,后端,Spring,启动加速,小技巧)