美文网首页java开发技巧大后端
SpringBoot小技巧之启动加速

SpringBoot小技巧之启动加速

作者: 凯凯雄雄 | 来源:发表于2021-06-24 17:00 被阅读0次

    相信大家使用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就好了,一定要注意喔。

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

    相关文章

      网友评论

        本文标题:SpringBoot小技巧之启动加速

        本文链接:https://www.haomeiwen.com/subject/hmcgyltx.html