Spring技术内幕总结 - IoC容器的实现

时间:2023-01-26 10:26:14

IoC:Inversion of Control,控制反转,即依赖对象的获得被反转了(DI:dependency inversion,依赖注入)
在Spring中,IoC容器是实现这个模式的载体。它可以在对象生成或初始化时直接将数据注入到对象中,也可以通过将对象引用注入到对象数据域中的方式来注入对方法调用的依赖。这种依赖注入是可以递归的,对象被逐层注入。

通过使用IoC容器,对象之间的相互依赖关系由IoC容器进行管理,并由IoC容器完成对象的注入。

IoC容器系列的设计与实现:BeanFactory和ApplicationContext

BeanFactory是简单容器系列,这系列容器只实现了容器的最基本功能
ApplicationContext应用上下文,它作为容器的高级形态而存在,增加了许多面向框架的特性,同时对应用环境作了许多适配。
BeanDefinition,是对依赖反转模式中管理的对象依赖关系的数据抽象,也是容器实现依赖反转功能的核心数据结构,依赖反转功能都是围绕着这个BeanDefinition的处理来完成的。
Spring技术内幕总结 - IoC容器的实现

IoC容器的初始化过程

1.Resource定位过程
这个Resource定位指的是BeanDefinition的资源定位,它由ResourceLoader通过统一的Resource接口来完成,这个Resource对各种形式的BeanDefinition的使用都提供了统一接口。

2.BeanDefinition的载入
这个载入的过程是把用户定义好的Bean表示成IoC容器内部的数据结构,而这个容器内部的数据结构就是BeanDefinition。BeanDefinition实际上就是POJO对象在IoC容器中的抽象,通过这个BeanDefinition定义的数据结构,使IoC容器能够方便地对POJO对象也就是Bean进行管理。
如载入的是xml文件,文件中bean包含的id、name、aliase、property(如Array、List、Set、Map、Prop)等元素会一一加载到BeanDefinition中。

3.向IoC容器注册这些BeanDefinition的过程
这个过程是通过调用BeanDefinitionRegistry接口的实现来完成的。这个注册过程把载入过程中解析得到的BeanDefinition向IoC容器进行注册。通过分析,我们可以看到,在IoC容器内部将BeanDefinition注入到一个HashMap中去,IoC容器就是通过这个HashMap来持有这些BeanDefinition数据的。

以上谈的是IoC容器初始化的过程,在这个过程中,一般不包含Bean依赖注入的实现。Bean定义的载入和依赖注入是两个独立的过程,依赖注入一般发生在应用第一次通过getBean的时候(lazyinit属性可以对容器初始化过程作一个微小的控制)。

IoC容器的依赖注入

当用户向IoC容器索要Bean时,BeanFactory中的getBean方法的实现,就是触发依赖注入发生的地方。getBean接口方法由doGetBean最终实现,如果在当前BeanFactory中找不到bean,则到双亲BeanFactory中去取,还找不到则顺着双亲BeanFactory链一直向上查找。如果获取的bean有依赖的bean,会触发getBean的递归调用,直到取到一个没有任何依赖的bean为止。

Spring技术内幕总结 - IoC容器的实现的更多相关文章

  1. Spring技术内幕:设计理念和整体架构概述(转)

    程序员都很崇拜技术大神,很大一部分是因为他们发现和解决问题的能力,特别是线上出现紧急问题时,总是能够快速定位和解决. 一方面,他们有深厚的技术基础,对应用的技术知其所以然,另一方面,在采坑的过程中不断 ...

  2. Spring技术内幕:SpringIOC原理学习总结

    前一段时候我把Spring技术内幕的关于IOC原理一章看完,感觉代码太多,不好掌握,我特意又各方搜集了一些关于IOC原理的资料,特加深一下印象,以便真正掌握IOC的原理. IOC的思想是:Spring ...

  3. Spring核心原理之IoC容器初体验(2)

    本文节选自<Spring 5核心原理> 1 IoC与DI基本概念 IoC(Inversion of Control,控制反转)就是把原来代码里需要实现的对象创建.依赖,反转给容器来帮忙实现 ...

  4. 《Spring技术内幕》学习笔记17——Spring HTTP调用器实现远程调用

    1.Spring中,HTTPInvoker(HTTP调用器)是通过基于HTTP协议的分布式远程调用解决方案,和java RMI一样,HTTP调用器也需要使用java的对象序列化机制完成客户端和服务器端 ...

  5. spring之:XmlWebApplicationContext作为Spring Web应用的IoC容器,实例化和加载Bean的过程

    它既是 DispatcherServlet 的 (WebApplicationContext)默认策略,又是 ContextLoaderListener 创建 root WebApplicationC ...

  6. 《spring技术内幕》读书笔记&lpar;1&rpar;——什么是POJO模式

    今天在看<spring技术内幕>,第一章中多次提到了使用POJO来完成开发,就百度了一下,在此保留 1.     什么是POJO POJO的名称有多种,pure old java obje ...

  7. Spring源码解析-ioc容器的设计

    Spring源码解析-ioc容器的设计 1 IoC容器系列的设计:BeanFactory和ApplicatioContext 在Spring容器中,主要分为两个主要的容器系列,一个是实现BeanFac ...

  8. 《Spring技术内幕》笔记-第二章 IoC容器的实现

    简单介绍 1,在Spring中,SpringIoC提供了一个主要的JavaBean容器.通过IoC模式管理依赖关系.并通过依赖注入和AOP切面增强了为JavaBean这样子的POJO提供事务管理,生命 ...

  9. Spring技术内幕——深入解析Spring架构与设计原理(一)IOC实现原理

    IOC的基础 下面我们从IOC/AOP开始,它们是Spring平台实现的核心部分:虽然,我们一开始大多只是在这个层面上,做一些配置和外部特性的使用工作,但对这两个核心模块工作原理和运作机制的理解,对深 ...

随机推荐

  1. IIS和tomcat共用80端口

    IIS和tomcat共用80端口 很多机器都需要同时使用tomcat和iis两个服务器以部署不同的网站,而解决共用80端口的问题也经常遇到,今天实际操作了一回,以下是具体步骤: 实现tomcat和ii ...

  2. 解决redhat的未注册问题

    昨天安装第五步的时候:开始是没有网,,,居然ping不通  网  ,服务器也ping不通,,,,,可能和我前几天删除了网络适配器有关,,把linux桥接对应的适配器给删了,,, 解决办法是打开虚拟网络 ...

  3. VBS基础篇 - FileSystemObject对象

    文件系统是所有操作系统最重要的部分之一,脚本经常会需要对文件及文件夹进行访问和管理,在Vbs中对桌面和文件系统进行访问的*对象是FileSystemObject FSO包含的常见对象有:       ...

  4. leetcode&commat; &lbrack;22&rsqb;Generate Parentheses &lpar;递归 &plus; 卡特兰数&rpar;

    https://leetcode.com/problems/generate-parentheses/ Given n pairs of parentheses, write a function t ...

  5. Android文字的阴影效果

    <!-- android:shadowDx 阴影的水平偏移量 即往右移的距离 --> <!-- android:shadowDy 阴影的垂直偏移量 即往下移的距离--> &lt ...

  6. Eclipse导出自己的项目(仅供自己保留方式war包)

    War: Jar包:

  7. 通过 phpmyadmin getshell

    通过 phpmyadmin  getshell general_log默认为关闭的,root权限开启后,general_log_file会保存所有的查询语句 可以开启general_log,然后设置g ...

  8. ubuntu&sol;debian 多版本gcc共存

    sudo add-apt-repository ppa:ubuntu-toolchain-r/test -ysudo apt-get update -ysudo apt-get install gcc ...

  9. 2018SDIBT&lowbar;国庆个人第五场

    A - ACodeForces 1060A Description Let's call a string a phone number if it has length 11 and fits th ...

  10. OOP的函数方法

    <?php class Computer{ //我要创建一个构造方法 public function __construct(){ echo '我是比较先进的构造方法!'; //构造方法一般用于 ...