前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >bean懒加载

bean懒加载

作者头像
LiosWong
发布2018-10-29 17:39:55
7740
发布2018-10-29 17:39:55
举报
文章被收录于专栏:后端沉思录
代码语言:javascript
复制
Indicates whether or not this bean is to be lazily initialized.
If false, it will be instantiated on startup by bean factories
that perform eager initialization of singletons. The default is
"false".

bean如果配置lazy-init="true"时,则在容器初始化过程中不会执行依赖注入,而当使用时才会去初始化bean,真的是这样么?下面就是深入源码探究,会分析以下三种情况:

  1. bean A没有引用任何其他bean,且配置成懒加载
  2. bean A引用了bean B,且bean A配置成懒加载
  3. bean A引用了bean B,bean A没有配置为懒加载,bean B配置为懒加载

首先代码入口还是 AbstractApplicationContext#refresh方法,其中在 AbstractApplicationContext#finishBeanFactoryInitialization方法中会执行 DefaultListableBeanFactory#preInstantiateSingletons:

代码语言:javascript
复制
for (String beanName : beanNames) {
            RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
            if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
                if (isFactoryBean(beanName)) {
                    final FactoryBean<?> factory = (FactoryBean<?>) getBean(FACTORY_BEAN_PREFIX + beanName);
                    boolean isEagerInit;
                    if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
                        isEagerInit = AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
                            @Override
                            public Boolean run() {
                                return ((SmartFactoryBean<?>) factory).isEagerInit();
                            }
                        }, getAccessControlContext());
                    }
                    else {
                        isEagerInit = (factory instanceof SmartFactoryBean &&
                                ((SmartFactoryBean<?>) factory).isEagerInit());
                    }
                    if (isEagerInit) {
                        getBean(beanName);
                    }
                }
                else {
                    getBean(beanName);
                }
            }
        }

关键代码是 !bd.isAbstract()&&bd.isSingleton()&&!bd.isLazyInit(),会判断bean是否为抽象类、单例、懒加载,如果不符合就不会执行if里的代码,其实第一、二中情况都不符合的,所以不会执行到if语句里的代码.关键是第三种情况,分析思路之前这篇(https://mp.weixin.qq.com/s/gduv_fAgB4-T13f6vsxkNw)分析是一样的,也就是在创建bean A的时候,在实例化其属性时,会创建bean B,有兴趣的朋友可以打断点调试,以下总结:

  1. bean配置lazy-init="true"时,在容器初始化时不会创建该bean
  2. 若一为单例且非懒加载的bean A引用了懒加载bean B时,在bean A被创建时,会创建bean B
  3. 非单例或为抽象类或配置lazy-init="true"的bean,都不会在容器初始化时创建bean
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-08-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后端沉思录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档