spring源码怎么看(数据仓库用hive还是hbase)

一、基本知识储备 1.Spring的bean注入方式 A).构造器注入 @Service publicclassBeanOne{ //注入对象BeanTwo privateBeanTwobt; //构造器 publicBeanOne(BeanTwobt){ this.bt=bt; } } @Service publicclassBeanTwo{ publicBeanTwo(BeanOnebo){ …

一、基本知识储备

1.Spring的bean注入方式

A).构造器注入

@Service
 public class BeanOne {
   
  		 //注入对象BeanTwo
  		  private BeanTwo bt; 
      //构造器
         public BeanOne(BeanTwo bt) {
           this.bt = bt ;
        }
 }
 
 @Service
 public class BeanTwo {
            public BeanTwo(BeanOne bo) {
                 ......
                 ......
     }
 
}

总结:构造器注入方式,Spring 是无法解决这种注入方式的循环依赖的,这种方式会在项目启动时抛出异常(
BeanCurrentlyInCreationException),至于为什么解决不了,暂且先不解释,后面会再说明,

B).Setter方式单例注入

@Service
 public class BeanOne {
     //注入对象BeanTwo
    private BeanTwo bt; 
    //一定要写被注入对象的set方法 
    public void setBeanTwo(BeanTwo bt) { 
					this.bt = bt;
    }
 }
 
 @Service
 public class BeanTwo {
    ......
    ......
}

总结:此种方式也会产生循环依赖问题,但Spring 在初始化时会对其进行处理,从而解决循环依赖问题

C).singleton模式field属性注入循环依赖(默认模式)

相信大家在写代码时都会用到这种写法:

@Service
public class AServiceImpl implements AService {
    @Autowired
    private BService bService;
    ...
}
@Service
public class BServiceImpl implements BService {
    @Autowired
    private AService aService;
    ...
}

总结:属性注入方式其实和Setter注入方式类似,Spring 在初始化bean过程中都会解决,只是两种注入还是有所区别。

2.三种注入方式的不同

  • 属性注入不能有效指明依赖

相信很多人都遇见过一个bug,依赖注入的对象为null,在启动依赖容器时遇到这个问题都是配置的依赖注入少了一个注解什么的。

这种方式就过于依赖注入容器了,当没有启动整个依赖容器时,这个类就不能运转,在反射时无法提供这个类需要的依赖。

依赖注入的核心思想之一就是被容器管理的类不应该依赖被容器管理的依赖,换成白话来说就是如果这个类使用了依赖注入的类,那么这个类摆脱了这几个依赖必须也能正常运行。然而使用变量注入的方式是不能保证这点的。

  • 而如果是采用构造器注入或者set注入,就可以避免以上问题:
  1. 使用set方式时,这是一种选择注入,可有可无,即使没有注入这个依赖,那么也不会影响整个类的运行。
  2. 使用构造器方式时已经显式注明必须强制注入。通过强制指明依赖注入来保证这个类的运行

2.循环依赖

循环依赖:顾名思义,就是N个类循环(嵌套)引用。

通俗的讲就是N个Bean互相引用对方,最终形成闭环。用一副经典的图示可以表示成这样(A、B、C都代表对象,虚线代表引用关系):

Spring源码解析,Spring是如何解决循环依赖问题的?

二、Spring如何解决单列循环依赖

首先,Spring内部维护了三个Map,也就是我们通常说的三级缓存

Spring源码解析,Spring是如何解决循环依赖问题的?

在Spring的DefaultSingletonBeanRegistry类中,你会发现上面定义了三个Map:

  • singletonObjects(一级缓存),称“单例池”“容器”,存储完整的单例Bean的地方。
  • singletonFactories(二级缓存) 存放原始的 bean 对象(尚未填充属性),用于解决循环依赖
  • earlySingletonObjects(三级缓存) 映射Bean的早期引用,也就是说在这个Map里的Bean不是完整的,甚至还不能称之为“Bean”,只是一个实例化Instance.

1.bean创建流程

Spring源码解析,Spring是如何解决循环依赖问题的?

2.关键代码解析

创建bean之前先获取bean,getSingleton()

  1. 先从一级缓存singletonObjects中去获取。
  2. 如果获取不到或者对象正在创建中(isSingletonCurrentlyInCreation()),那就再从二级缓存earlySingletonObjects中获取。
  3. 如果还是获取不到,且允许singletonFactories(allowEarlyReference=true)通过getObject()获取。就从三级缓存singletonFactory.getObject()获取。(如果获取到了就从singletonFactories中移除,并且放进earlySingletonObjects。其实也就是从三级缓存移动到了二级缓存
Spring源码解析,Spring是如何解决循环依赖问题的?

未完,待续。。。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2022年5月13日 下午3:22
下一篇 2022年5月13日 下午3:22

相关推荐

  • 电脑怎么连接电视,详细操作步骤请看本篇

    与电视屏幕相比,笔记本的显示屏真是太小了,看电影没有大片的感受!怎么破? 如何笔记本与电视连接,随时随地在家看片?下面,小编就为大家介绍笔记本链接液晶电视的方法。 一、笔记本和电视怎么连接 笔记本连接电视首先要先确定液晶电视有什么视频输入接口,目前而,笔记本连接液晶电视比较常用的接口有VGA,DVI和HDMI。其中DVI和HDMI都是数字传输,为了画面品质更有保证。HDMI更可以同时传输音频,不必…

    2022年8月16日
    610
  • 苹果手机充不了电怎么办,解决苹果充不了电小妙招

    我们日常在使用iPhone的过程中,经常会碰到苹果手机充不进电。其实也不仅仅是iPhone手机,包括iPad,还有安卓手机,也经常会碰到这个问题。导致手机充电充不进去的原因有很多,所以我们需要一一排查。 一般来说,使用年数较久的手机容易出现充不上电的情况,新机很少会出现这种情况。基本的症状是,给手机插上充电数据线后,iPhone能正常显示充电符号,但是几个小时过去了,电量丝毫没有增加。 考虑到这个…

    2022年7月2日
    520
  • 买车计算器2022(买车计算器在线计算)

    汽车购置税是根据《中华人民共和国机动车购置税法》的规定,不管是私家车还是单位车,都必须缴纳的税种。车购税是在上牌前必须缴纳的。根据道交法中的《机动车使用规定》的要求,车购税不缴纳,车辆不能上牌。(当然,免费车辆除外,比如说新能源车,国家规定的其它特殊车辆,免费车辆需要办理免费证明)。 车购税是一次性缴纳的。上完牌后,即使车辆转移,过户都不需再缴。它不同于车船税,而车船税是每年要缴纳的。 2022年…

    2022年5月3日
    2890
  • 网站如何优化排名,网络排名优化软件推荐

    当今,搜索引擎是大人获取信息的很重要手法,没有之一,所以,网站的关键词排名太重要了,要想自己网站的关键词排名至主页,现在只要两种手法:1、做搜索引擎付费推行;2、做好网站SEO;今日,咱们不评论搜索引擎付费推行,究竟这笔费用不是任何公司能够负担得起的,而且,付费推行还有一个糟糕的下风,一旦付费中止,你的网站排名也就没有了。接下来咱们评论一下免费的SEO优化技能。接下来,我会同咱们评论一个新网站快速…

    2022年7月28日
    4140
  • 网站被劫持了怎么修复,分享两种快速网站域名劫持解决方法

    问:我的网站被同行恶意的镜像网站,被降权了怎么办? 网站被黑被恶意镜像,被植入垃圾代码,现象屡见不鲜。站长管理员应该及时发现分析网站数据和代码。不要等着网站出现了危机,再去进行恢复和处理。带来的后果严重影响排名的周期和SEO效率。 网站被黑被劫持了怎么办? 下面讲几个点,针对于网站被黑被劫持了的解决办法。 第一,网站程序的安全,我们使用开源程序。一定要做好程序版本的更新和勤打补丁。使用越多的程序使…

    2022年9月17日
    640
  • 靠谱的赚钱方法有哪些,15个真实靠谱的网上赚钱方法

    外出上班找工作是当下的基本工作常态,但是当自己一个人在家时,我们同样可以通过自己的智慧和才能,在网络上进行赚钱收益,这同样会成为个人一笔不菲的收入。接下来我就介绍一下当前可以利用网络来赚钱的15个项目! 1、通过写软文赚钱 文职类的工作,在近几年的岗位职业中非常的火热,例如写通告稿、广告稿、微信软文等,这些都是目前较火的赚钱方式。同时,一些大学生也会通过兼职去写软文稿,赚取外快,当软文稿写得多的,…

    2022年8月7日
    640
  • 怎么优化企业网站,企业网站快速优化到首页的技巧

    一、关键词是重点 用户是通过搜索关键词,查找信息的,要想提高自己网站被点击率,必须做好关键词优化,做关键词优化第一步,就是筛选关键词,要根据用户需求、企业业务、盈利模式来选择关键词,在结合网站结构,依据关键词优化难易度,布局到网站每一个页面,这样能够让更多的核心关键词与长尾关键词上首页; 二、标题是要点 网站标题优化不能在像以前那样堆砌关键词,现在百度也更新了算法,明文规定网站每一个页面标题的写法…

    2022年7月1日
    640
  • 自助建站系统哪个好,国内最大自助建站介绍

    在自建站浪潮愈演愈烈的电商世界,不少卖家跃跃欲试。那么自建站搭建和维护的成本真的很高吗?过程中需要大量的专业人员吗?中小卖家又是否有捷径可走?答案是肯定的。 无论是独立站新手卖家还是经验丰富的成熟零售商都离不开自建站工具和平台。而合适的自建站平台可以提高卖家的日常业务效率,最大化投资回报率。 目前在市面上有众多自建站平台可供选择,Magento、Shopify和WooCommerce就是其中的三大…

    2022年7月28日
    650
  • 改ip地址的软件有哪些(修改网络ip地址的优缺点)

    在如今这个大网络环境中利用手机电脑等设备进行网络办公、网络游戏及网络设置都会使用到IP切换工具来提升网络使用效率以及解决IP限制IP封禁问题,但往往有一些网民冒着可能存在的网络安全风险使用免费的换IP工具,这些所谓“免费”的东西,或多或少都会存在安全隐患,数据隐私得不到保障,下面小编集中盘点一下免费代理IP有哪些弊端? 免费更换IP地址工具的弊端有哪些? 一、没有安全保障 在手机电脑设备中使用换I…

    2022年5月11日
    840
  • 通过网络赚钱的项目有哪些,网络挣钱的几种方法分享

    网络赚钱的几种方法(最全收集总结) 1、威客 威客赚钱就是有人提出需求,而我们提供服务。例如给孩子起名字,想个广告语,策划个活动,设计个方案等等等,五花八门,那里就是小型的智库,只要你会,就有人需要你的智慧。目前国内最火的就是猪八戒威客网,如果你没有什么技能,也可以做谢简单的,比如发祝福短信,注册等等,或者你可以接起名字的单,然后线下找那些专门起名的人,做对接! 2、自媒体赚钱 这几年自媒体比较火…

    2022年8月16日
    630

发表回复

登录后才能评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信