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

相关推荐

  • 适合小本创业的项目有哪些,40个小本生意成功案例

    常来说,小本创业项目应具备3点要素:1、市场竞争力小,可塑性强的行业;2、市场潜力大,有可开发性,需要长期培养的市场不要做;3、投资小见效比较快的行业。对于现在的年轻人来说,由于缺少社会经验以及资金的短缺,在初次选择创业项目时,应尽量选择小本创业项目,这样可以大大降低创业风险,那么都有哪些是适合年轻人的小本创业项目呢? 一:网上开店 网上开店从淘宝诞生到现在造就了不少有钱人,网上创业开店应该也是很…

    2022年7月10日
    510
  • 男士控油最好的洗发水排行榜(控油效果口碑最好的7款洗发水)

    男生们平时都比较忽视自己用的洗发水类型,大多数都是乱买一气,殊不知其实男生专用的洗发水作用特别的大。特别是有头皮问题的一些男生们,你们一定要找到适合自己的男士洗发水,能让头发情况改善很多。 洗发水之所以会分“男女”,主要因为男性较女性头皮的皮脂分泌更旺盛,而女士头发长、相对烫染频率高。因此相对女性,大部分男生的头发偏油腻但发质健康,女生则更多的是受损发质,更需要修护,由此导致了二者对洗发的不同需求…

    2022年9月20日
    540
  • seo优化难学吗,学seo需要学什么专业

    学习SEO网站优化难吗?不难,SEO可以说是在网络营销行业中相对简单的一项技能,编辑撰写文章是基本技能。这个技能小学就开始学习了,再学一点营销知识,再学一点优化常识,就可以开始进行基础优化,优化的学习门槛和难度都低。 为什么大多数人做不出效果,很大一部分原因,在于没有坚持。回想,在小学,有几个人天天坚持写日记,周周写周记,每次写作文都很痛苦,不知道写什么。所以虽然网站优化的门槛低,难度小,不等于每…

    2022年6月15日
    630
  • iphone怎么备份通讯录,icloud通讯录导入手机步骤

    大家知道苹果手机怎么备份通讯录吗?前段时间小编的手机联系人意外丢失了,这时候才觉得备份苹果手机联系人还是很有必要的,那么iPhone手机电话号码怎么备份呢?其实想要导出iPhone手机联系人并没有那么复杂,借助专业的恢复软件的话,我们是可以将苹果手机通讯录备份到电脑上的,今天小编就借助开心手机恢复大师软件给大家演示一下如何备份苹果手机联系人吧。 备份苹果手机联系人的准备工具: 开心手机恢复大师 苹…

    2022年6月6日
    760
  • 20英寸拉杆箱多大容量(地平线8号20寸登机箱开箱测评)

    作为一个每场发布会必看的锤友,今年的秋季发布会虽然没有手机,但是加湿器和拉杆箱对我来说算是刚需。另外,锤科的手机由于价格、品控等种种原因一直销量一般,但其别出心裁和充满贴心关怀的各种设计一直深得我心,这次趁着双11入手了银色铝镁合金“商务”拉杆箱和优惠后189的pc材质拉杆箱,一个出差用,一个和妻子同时出游时用。 【京选尚品】地平线8号(LEVEL8)商务旅行箱(标准版)铝镁合金登机箱20英寸拉杆…

    2022年10月24日
    520
  • 洗碗机哪个牌子好,洗碗机十大名牌排行榜

    世上有一种悲催,叫“我不想洗碗”! 那有没有什么办法能摆脱洗碗这件令人讨厌的事情呢? 家用洗碗机的诞生,无疑可以帮助解决这一难题。但相对于其他成熟家电,洗碗机在国内的普及率并不高,这主要源于大多数人对于洗碗机产品心存疑虑,存在“费水、费电”、“洗不干净”等各种担忧。事实真的如此吗?广东省消委会联合佛山消委会对包括老板、西门子、美的、海尔等10款家用洗碗机进行了比较试验。 ▲说明:样品中除西门子外,…

    2022年7月11日
    810
  • 返利网是干什么的,返利网运作原理

    淘宝购物,是很多人都喜欢的一种网上购物方式。因为网上购物比较方便,而且那种收到货,拆开包装的感觉给人一种拆礼物的幸福感,所以,很多人都喜欢淘宝购物。可是,购物多了就会花很多钱,就会想,如果能够优惠一点就好了。所以就有了淘宝返利网站。 你听说过购物返利吗?是不是第一反应认为是骗人的? 其实淘宝京东都有返利(淘宝联盟,京东联盟)。返利,又名销售提成,是企业销售政策中不可或缺的内容,也是经销商十分关心的…

    2022年6月20日
    870
  • 外贸网站优化正确的方法(一套完整的优化方案)

    随着网络竞争的激烈,各行各业都是各显神通,当然外贸行业的竞争也不例外。但是,不管竞争如何,企业们都知道网络营销推广是当前必不可少的手段。特别是在外贸交易中,有些企业无法直接联系到外国用户资源,所以只能通过有效的手段——优化外贸网站,让更多的用户了解到该网站的存在,最终实现产品的转化。 那么,外贸网站优化如何做?优化技巧有哪些?我们一起往下看看吧。 一、外贸网站优化如何做? 外贸网站优化需要一定的技…

    2022年8月4日
    640
  • 有哪些设计感强的网站,网购网站十大排名介绍

    大家都知道,身处于互联网时代下的我们,不管是在工作中还是在学习中,多多少少都需要自己设计、制作一些海报、宣传图等等的东西。对于没学过设计的我们来说这可是一个非常难的事情呢~今天小编将推荐几个非常强大好用的设计网站,让你也能轻松成为设计师~ 一、Dribbble 这是一个面向创作家、设计师等等与设计相关人群的交流网站,我们可以在里面看到非常多优秀的、高质量的设计作品。我们也可以通过这些作品进行学习和…

    2022年6月13日
    880
  • TikTok出售不带源码的美国业务,买家或是甲骨文!

    腾讯科技讯9月14日消息,在Tiktok母公司字节跳动出售Tiktok美国业务的交易中,该公司可能不会把用于构建TikTok算法的代码移交给美国买家。据悉,字节跳动已向竞购方和美国当局通知了该公司改变的立场。 随着剥离TikTok美国业务的最后期限日益临近,字节跳动渴望完成出售。但在周二谈判截止日期之前,字节跳动显然已改变了最初实际出售的业务。知情人士称,字节跳动“不会向任何美国买家移交构建Tik…

    2022年10月21日
    380

发表回复

登录后才能评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信