IOC原理解读(二)

IOC原理解读(二)

继上篇

今天解读的是:

    基于xml配置的bean的IOC过程中的实例化跟依赖注入原理。

xml配置文件spring-bean.xml内容如下:

在加载完各个bean的definition到一个beanDefinitionMap后,是如何实例化bean呢?

先看看那些地方在需要获取bean definition,从这里找入口

1、查看获取definition的方法是哪被调用的

在AbstractBeanFactory类中看到具体调用

然后在doGetBean方法中找到了

然后终于找到了 是AbstractBeanFactory 类中的 getBean(String name) 是真正调用的地方

然后在AbstractApplicationContext中找到了调用

同类中调用

同类中调用(beanFactory 在refresh方法中始终贯穿)

看到这,我们大致知道了,实例化bean跟依赖注入的流程

Spring IoC容器对Bean定义资源的载入是从 AbstractApplicationContext 的 refresh() 函数开始的

refresh()是一个模板方法,refresh()函数的作用在于:在创建Ioc容器前,如果已经有容器存在,则需要把已有的容器销毁和关闭,以保证在refresh之后使用的是新建立起来的IoC容器。

refresh的作用类似于对IoC容器的重启,在新建立好的容器中对容器进行初始化,对Bean定义资源进行载入。

AbstractApplicationContext

refresh中的具体步骤

1、准备刷新此上下文;

2、告诉子类刷新内部bean工厂;

3、准备bean工厂以便在此上下文中使用;

4、允许在上下文子类中对bean工厂进行后处理;

5、调用上下文中注册为bean的工厂处理器;

6、注册拦截bean创建的bean处理器;

7、为此上下文初始化消息源;

8、为此上下文初始化事件多主机;

9、初始化特定上下文子类中的其他特殊bean;

10、检查侦听器bean并注册它们;

11、实例化所有剩余(非lazy init)单例;

   第二个参数false代表,这次加载的没有排除单例的bean定义,根据这些bean的名字,获取bean,实例化bean,并且在实例化过程中完成依赖注入

12、最后一步:发布对应事件;


下面我们看看具体是如何对bean进行实例化,然后完成依赖注入的

先看是如何完成所有需要实例化对象的实例化的

doGetBean方法

//这里是实际取得Bean的地方,也是触发依赖注入的地方

先不着急,看看具体实例化是如何操作的(也就是doGetBean())?逐个实例化

如果有依赖的对象,那么将依赖的对象全部实例化!直到逐层依赖的对象,全部创建成功为止。

getBean是依赖注入的起点,之后会调用createBean,下面我们分析createBean的代码

doCreateBean方法

createBeanInstance方法

跟随上面的步伐,上面实例化的时候调用了instantiateBean方法,该方法代码如下:

我们重点关注 getInstantiationStrategy() 这个方法,可以看到instantiateBean方法的功能实现是通过调用getInstantiationStrategy().instantiate方法实现的。 

getInstantiationStrategy 方法的作用是获得实例化的策略对象,也就是指通过哪种方案进行实例化的过程。继续跟踪下去我们可以发现,Spring当中提供了两种实例化方案: BeanUtils 和 Cglib 方式。

BeanUtils实现机制是通过Java的反射机制,Cglib是一个第三方类库采用的是一种字节码加强方式机制。 

Spring中采用的默认实例化策略是Cglib。 

重点关注如下方法

如果没有重写,则不要用cglib重写类

其他地方没有改变当前对象的方法逻辑(没有被重写)

存在重写的方法就用Cglib

为什么?

正确解释如下:跟lookup-method注入和replace-method注入有关 见:

https://www.smwenku.com/a/5b9959102b717757338f4b18/

https://blog.csdn.net/lyc_liyanchao/article/details/82432993


Java 反射机制 创建对象

使用Cglib API 实例化对象

然后讲解注入依赖

看了上面的代码后,我们应该重点关注 createBeanInstance() 和 populateBean() 这两个方法。其中,populateBean() 开始 就是注入依赖

注入依赖

1、填充bean对象

2、暴露对象;

至此,终于完成了 实例化、依赖注入

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容