当前位置:首页 > 生活百科

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

栏目:生活百科日期:2024-11-30浏览:0

一、基本知识储备

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属性注入循环依赖(默认模式)

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

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

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

2.三种注入方式的不同

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

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

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

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

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

2.循环依赖

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

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

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

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

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

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

1.bean创建流程

2.关键代码解析

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

先从一级缓存singletonObjects中去获取。如果获取不到或者对象正在创建中(isSingletonCurrentlyInCreation()),那就再从二级缓存earlySingletonObjects中获取。如果还是获取不到,且允许singletonFactories(allowEarlyReference=true)通过getObject()获取。就从三级缓存singletonFactory.getObject()获取。(如果获取到了就从singletonFactories中移除,并且放进earlySingletonObjects。其实也就是从三级缓存移动到了二级缓存

未完,待续。。。

“spring源码怎么看(数据仓库用hive还是hbase)” 的相关文章

中学生怎么赚钱最简单,中学生赚钱的10个方法

你还在群里发黄、赌、刷单、荐股等虚假信息吗?你还在赚触犯法律的风险钱吗?这里有一个合法、赚快钱,无门槛、零成本的创业兼职平台。可助力大学生顺利毕业,赠人玫瑰,手...

微信抽奖小程序怎么弄,微信群内抽奖方式介绍

为了吸引用户,商家会做一些活动,利用赠送或充值的积分来进行抽奖,现在来讲下微信小程序如果实现轮盘抽奖的功能,先看下图:上面展示的就是轮盘抽奖,一共有六个奖项,其...

优盘修复软件哪个好用(u盘读不出来修复方法)

U盘相信是现在许多人都会使用到的一个便携小工具了,而很多人不知道的是,其实对于U盘这么一个数码小玩意儿,其中还是有很多门道的。首先就是U盘品牌,很多人都觉得品牌...

优酷广告开户怎么做(优酷广告投放的优势和特点)

优酷视频广告是一款通过智能的实时竞价技术,优酷视频以每日总播放量150亿,总频道500家,总节目800个,总分成2400万的数据表明,强大的曝光力度一时间锁定目...

如何修复office程序(控制面板修复office的窍门)

目前大家用的最多的办公软件中,WPS和office用的应该是最多的。任何软件在使用的过程中,都会出现这样或者那样的问题,一般出现问题最先想到的就是卸了重装,但是...

怎么创微信公众号,注册个人公众号的流程

今天就来说一下如何注册属于自己的公众号这里需要提醒两点,第一个是注册公众号是免费的,不用花一分钱,需要交钱的都是骗人的。第二个是操作需要电脑,手机可以注册,但是...

创建网站大约多少钱,新手建站费用明细表

这问题在工程师或设计师的眼里就如「一辆车子多少钱?一个房子多少钱?」,这个问题实在空泛到一个让人无法言语的境界,这也是我最常被问到的问题「做一个网站多少钱?」。...

csgo准星怎么调好用(最适合csgo准星的设置方法)

s1mple游戏分辨率:1280×960(强制拉伸)准星设置:cl_crosshairalpha&“255&”;cl_crosshair...

工薪阶层如何理财收益最高,四个适合工薪阶层的理财方法

人间真的很难老李是朋友圈出了名的“拼命三郎”。朋友都劝他找机会好好休息,但他却表示,自己不敢停下来,直到有次发烧严重去了医院,医生诊断为肺炎,而且怀疑他肺部有肿...

公司代办需要多少钱(附:代办流程和详细费用)

小微律政公司注册的流程包括:收集材料→核准名称→网上申报→工商交件→领取执照。598元起,无论您有无地址均可注册。第一步、收集材料(1-3个工作日)您需要提交实...