spring bean 懒加载、获取方式与瘦身启动

随着项目越来越大,发现项目启动时间越来越长,有个需要连接远程注册中心的服务,网络有点波动更是好久启动不起来。

 

根据我的探索,对spring项目进行瘦身启动,目前的最好方式是,首先要将所有单例 bean 设置为懒加载。

设置懒加载的方法可以在 beans 标签上加 default-lazy-init="true",这种方法可能需要加在多个文件上。

 

也可以实现一个 BeanDefinitionRegistryPostProcessor,对所有 bean 自动进行懒加载,当然也可以在这里面移除 bean 。

 


@Component
@SuppressWarnings("unchecked")
public class QuickStartPostProcessor implements BeanDefinitionRegistryPostProcessor {

    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry bdRegistry) throws BeansException {
        String[] beanDefinitionNames = bdRegistry.getBeanDefinitionNames();
        HashSet<String> jsfProviderInterfaceSet = new HashSet<>();
        for (String beanDefinitionName : beanDefinitionNames) {
            BeanDefinition definition = bdRegistry.getBeanDefinition(beanDefinitionName);
            String beanClassName = definition.getBeanClassName();
            definition.setLazyInit(true);
        }
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
    }
}

 

设置完懒加载并不是就搞定了,我们还要检验一下是否达到了我们预想的结果,验证方法就是看启动时 spring 都初始化了哪些 bean,我们调用时是新创建的 bean 还是从缓存中取得。

 

因为非懒加载的 bean 会靠着层层依赖关系硬是将很多懒加载的 bean 给初始化了

 

那么,怎么验证呢,我们可以将 org.springframework.beans.factory.support.DefaultListableBeanFactory 的日志级别设置为 debug

<Logger name="org.springframework.beans.factory.support.DefaultListableBeanFactory" level="DEBUG" additivity="false" includeLocation="true"/>

这样就能打印出获取 bean 是新建的还是从缓存中获取的。

打印日志如下所示

 

有了这个核武器,我就能找出 bean 懒加载失败的罪魁祸首了,然后去掉它就行了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值