开启 Spring 全局 bean 懒加载的好处
- 可以加快启动速度,当服务依赖很多的时候,增速非常明显。
- 服务启动时不用考虑依赖,不需要满足所有的依赖就可以启动服务
- 建议 在 test, qa, dev 等环境酌情开启,在自己本机调试测试时可以只测试部分功能,只需要保证需要测试的功能依赖满足即可
- 生产环境一般不建议开启
- 本机单元测试的时候使用全局懒加载和 @mock 结合
开启 Spring 全局 bean 懒加载的坏处
- 屏蔽了启动时对 bean 的依赖检查,当 bean 不满足生成条件的时候需要等待实际调用才会暴露出来
- bean 在第一次使用的时候才初始化,影响第一次访问的速度
Spring 懒加载注意事项
- 当开启全局懒加载以后,某个 bean 不希望懒加载时可以加上 @Lazy(false) 注解
- quarz 定时任务不能延迟加载,如果延迟加载的话就可能导致定时任务失效
- sdk 静态方法调用会因为懒加载导致依赖的 bean 无法加载。例如
@Component
public class Client {
private static ServiceA service;
public class Client(ServiceA service) {
Client.service = service
}
// 当调用 Client.hello()方法时会报错
public static String hello() {
return service.hello();
}
}
开启 Spring 全局 bean 懒加载的方式
方法1.Spring boot 2.2 版本以上,可以设置 spring.main.lazy-initialization=true
方法2. 增加一个配置类 LazyInitBeanFactoryPostProcessor
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
/**
* 懒加载加快启动速度
* @author liufang
*/
@Profile(value = {"qa", "dev"})
@Configuration
public class LazyInitBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
for (String beanName : beanFactory.getBeanDefinitionNames()) {
beanFactory.getBeanDefinition(beanName).setLazyInit(true);
}
}
}