随着项目越来越大,发现项目启动时间越来越长,有个需要连接远程注册中心的服务,网络有点波动更是好久启动不起来。
根据我的探索,对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 懒加载失败的罪魁祸首了,然后去掉它就行了。