首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >延迟初始化Spring Bean:延迟初始化的Bean会影响依赖注入吗?

延迟初始化Spring Bean:延迟初始化的Bean会影响依赖注入吗?

作者头像
码农架构
发布于 2020-10-26 16:00:55
发布于 2020-10-26 16:00:55
2.1K0
举报
文章被收录于专栏:码农架构码农架构

前面提到过Bean的初始化方式,在Bean 的配置元信息时候我们知道Bean的元信息配置中有lazy-init 延迟初始化属性配置,延迟初始化Spring Bean 还有Java 注解API的方式实现

案例分析

这里已Java 注解方式案例讲解描述

代码语言:javascript
复制
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Lazy {

    /**
     * Whether lazy initialization should occur.
     */
    boolean value() default true;

}

看到Lazy 注解有默认属性配置true,非延迟加载;如果我们使用非延迟加载其实可以不用标注此注解,这里方便代码阅读标注上

  • 非延迟加载

运行结果 可以看出延迟加载在应用上下文启动之后加载

  • 延迟加载

运行结果 可以看出延迟加载在应用上下文启动之前加载

分析

其中的差异可以查看源码分析在

代码语言:javascript
复制
applicationContext.refresh()

启动应用上下文方法中可以看到一个方法

代码语言:javascript
复制
finishBeanFactoryInitialization(beanFactory);

这个方法的作用是完成Bean的初始化动作,看注释

代码语言:javascript
复制
Instantiate all remaining (non-lazy-init) singletons.

它的意思就是:它会去初始化或者是实例化我们所有的非延迟初始化的一个单体类或者单体Bean

进入方法里面又可以发现

代码语言:javascript
复制
// Instantiate all remaining (non-lazy-init) singletons.
finishBeanFactoryInitialization(beanFactory);

这里又进行补充,就是初始化我们剩余的这些东西

换而言之在我们应用上下启动的时候有一个前置动作,普通的Bean在这里初始化 ,部分Bean是需要我们内部容器自己做初始化 。另一个动作就是延迟加载按需加载Bean

总结

其实延迟加载和非延迟加载在定义的时候,就是Bean注册的时候是没有区别按照你需要的时候进行注册;但是在依赖查找和依赖注入的时候它的区别就体现出来了,一个是在应用上下文启动之前,另一个在应用上下文启动之后

源码地址:

https://gitee.com/iByteCoding/thinking-in-spring

往期推荐

初始化Spring Bean:Bean初始化有哪些方式?

注册Spring Bean:如何将BeanDefinition注册到IoC容器?

定义Bean:什么是BeanDefinition?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-29,如有侵权请联系 cloudcommunity@tencent.com 删除
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档