目录

0.面向接口编程思想

1.依赖倒置原则与好莱坞原则

2.控制反转

3.依赖注入

4.Spring是如何实现依赖注入的?

4.1 BeanFactory

4.2 FactoryBean


0.面向接口编程思想

面向接口编程:不针对实现编程,针对超类型编程。超类型包括继承和多态。而依赖倒置原则与好莱坞原则可以说是思想的具体体现,其表现形式便是控制反转,注入依赖则是控制反转的实现方式。其具体关系如下图1所示:

图1

1.依赖倒置原则与好莱坞原则

1.1依赖倒置原则:

  • 高层不应该依赖于低层,它们共同依赖于一个抽象;
  • 抽象不能依赖于具象,具象依赖于抽象。

1.2好莱坞原则:

  • (低层)别调用我们(高层),我们(高层)会调用你(低层)。

2.控制反转

在Spring中,框架和组件存在双向的强依赖关系:

一方面,在用户使用框架时,组件被动地响应框架的调用请求,即组件依赖框架。根据依赖倒置原则,应该在两个模块之间定义一个组件的抽象接口,高层(框架)调用组件抽象接口定义的函数,低层(组件)模块实现该接口,消解了从组件到框架之间的依赖关系。

另一方面,框架运行时,会主动调用组件,即框架依赖组件。根据好莱坞原则,应该在两个模块之间定义框架中一个模板方法的抽象接口,高层(框架)调用模板方法抽象接口定义的函数,低层(组件)模块实现该接口,消解了从框架到组件之间的依赖关系。

为什么说是控制反转了呢?因为不论是依赖倒置原则还是好莱坞原则,最终都是使框架主导一切,框架控制组件。也可以这样说,控制反转使得过去框架和组件之间双向的强依赖关系,变成单向的弱依赖关系(框架通过抽象控制组件)。

3.依赖注入

依赖注入是控制反转的具体实现方式。具体有三种形式:构造函数注入,接口注入和属性注入。下面我以构造函数注入为例,假设组件A在运行时需要组件B,如果没有控制反转的框架,那么:

这样我们会发现存在一些问题:
(1). 如果现在要改变 b生成方式,如需要用new B(String name)初始化 b,需要修改 A 代码;
(2). 如果想测试不同 B对象对 A的影响很困难,因为 b的初始化被写死在了A的构造函数中;

但是我们如果利用IOC框架,在A的构造函数中注入B,那么IOC框架会这样做: 对象A依赖于对象B,当对象 A需要用到对象B的时候,IOC容器就会立即创建一个对象B送给对象A。IOC容器就是一个对象制造工厂,你需要什么,它会给你送去,你直接使用就行了,而再也不用去关心你所用的东西是如何制成的,也不用关心最后是怎么被销毁的,这一切全部由IOC容器包办。如下图所示:

4.Spring是如何实现依赖注入的?

当我们实现一个Bean之后,我们如何使其与Spring框架发生关系,即注入到Spring框架?这里我们不具体讲Bean的实现方式以及三种注入方式(构造函数注入、接口注入、方法参数注入和接口注入)。

对于前三种注入方式,我们都需要两步操作(以上面的组件A调用B为例):

  1. 解析A的XML文件,将其信息注册到Spring中;
  2. B在Spring中寻找解析好的A的信息;

第一步解析XML文件使用了Spring源码中的BeanFactory类,第二步使用了FactoryBean类。接下来的内容主要分这两块来介绍。

4.1 BeanFactory

BeanFactory主要的实现类是XmlBeanFactory。

1、在初始化XmlBeanFactory之前,需要通过ClassPathResource封装配置文件,这样才能进行后续的资源处理;

2、当配置文件被封装为Resource之后,Resource的加载工作就交给XmlBeanDefinitionReader中的reader.loadBeanDefinitions(resource)来处理了;

3、doLoadBeanDefinitions()才是真正的核心处理部分:

3.1、获取对XML文件的验证模式;

3.2、加载XML文件,并获得对应的Document;

3.3、根据返回的Document,解析及注册Bean信息,即BeanDefinitions。

这里我们主要介绍3.3,分为两块:解析BeanDefinitions以及注册BeanDefinitions。

3.3.1、解析BeanDefinitions:

(1)解析id以及name属性;

(2)进一步解析其他所有属性并统一封装至GenericBeanDefinition类型的实例中;(反射就是在这一步中完成

(3)如果检测到bean没有指定beanName,那么使用默认规则为此bean生成beanName;

(4)将以上信息封装到BeanDefinitionHolder实例中。

3.3.2、注册BeanDefinitions:

(1)校验AbstractBeanDefinition;

(2)对beanName已经注册的情况的处理;

(3)通过Map将beanName与beanDefinition一一对应,即注册beanDefinition;

(4)清除解析之前留下的对应的beanName缓存。

4.2 FactoryBean

这里推荐看下郝佳写的《Spring源码深度解析》第五章,讲的非常好。

参考:

https://dotnetfresh.cnblogs.com/archive/2005/06/27/181878.html

https://www.cnblogs.com/sunzhao/p/8334008.html

https://www.jianshu.com/p/93246db67549

https://blog.csdn.net/qq_26323323/article/details/80968920

Spring之控制反转(IOC)相关推荐

  1. java-12:spring MVC - 控制反转IOC,依赖注入DI

    学习spring框架之前,先理解几个概念: 1.第一部分:依赖倒置原则 2.第二部分:控制反转,控制反转容器(实例) 3.第三部分:控制反转,控制反转容器(全面理解,面试题) 综合性理解:控制反转(I ...

  2. Spring中控制反转IoC理论推导

    Spring中的IoC是一种思想.所谓控制反转,也就是从创建对象的主动权在程序员手中,到创建对象的主动权在用户手中.控制反转官方定义是一种通过描述(XML或注解)并通过第三方生产或获取特定对象的方式, ...

  3. Spring的控制反转与依赖注入

    学习过Spring的都知道Spring有三大核心的概念,分别是控制反转(IOC).依赖注入(DI)和面向切面编程(AOP).今天就来聊聊我对控制反转和依赖注入的了解,至于面向切面编程放到后面讲解. 一 ...

  4. 浅析Spring——控制反转IoC

    目录 1. IoC理论推导 2. 什么是IoC? 3. 引入DI 4. IoC容器 5. 注入对象的四种方法 1.基于接口 2.基于setter 3.基于构造函数 4.基于注解 6. 两种IoC实现方 ...

  5. Spring的控制反转(IOC)和依赖注入(DI)具体解释

    Spring的控制反转(IOC)和依赖注入(DI)具体解释 首先介绍下(IOC)控制反转: 所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的.这样控制器就有应 ...

  6. 控制反转IOC与依赖注入DI

    为什么80%的码农都做不了架构师?>>>    1. IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最 ...

  7. 控制反转 java_控制反转( Ioc)快速入门

    2.1 什么是控制反转(IOC:Inverse of Control) IOC反转控制,实际上就是将对象的创建权交给了Spring,程序员无需自己手动实例化对象. 可以看出来工厂的作用就是用来解耦合的 ...

  8. 控制反转(IoC)与依赖注入(DI)详解

    文章目录 什么是控制反转(IoC) 控制反转(IoC)有什么作用 控制反转(IoC)是怎么分类的 依赖注入 接口注入 Setter方法注入 构造器注入 依赖查找 上下文依赖查找(Contextuali ...

  9. Spring 的控制反转/依赖注入

    第一章 Spring 的控制反转/依赖注入 回顾 增删改查. 课前测: 本章内容 spring:春天 IOC:将创建对象的权力交给 spring 核心容器去控制.工厂模式 BeanFactory: 懒 ...

  10. SSM框架—Spring基础—控制反转和依赖注入(概念)

    控制反转: 控制反转(IoC)是面向对象编程的一个设计原则,用于降低代码耦合度 在传统面向对象编程中,获取对象的方式是用关键字"new"主动创建一个对象,也就是说,应用程序掌握着对 ...

最新文章

  1. java8 lambda python_【学习笔记】java8 Lambda表达式语法及应用
  2. priorityqueue 的 add和offer方法有区别吗_日常在家安吉白茶应该如何去保存?城市与农村存放的方法有区别吗...
  3. 设置网页背景图片不显示
  4. spring aopalliance 包里都有什么_【九仓樱】翻包記 05 | 是什么让我的便当包里每天都带着小企鹅?!...
  5. 2017年大白菜系统操作说_为什么操作系统在2017年更重要
  6. 资源放送丨《MySQL的查询与优化》PPT视频
  7. java 存储输入_java将用户输入信息保存至txt文件
  8. poj 3630 Phone List trie树—字典树 静态数组版!!!
  9. Alex 的 Hadoop 菜鸟教程: 第6课 Hbase 安装教程
  10. 面向GitHub学习网课
  11. CSS属性—居中对齐篇
  12. 远离奸商-查看CPU信息是否被修改
  13. 学生给老师的一道思考题
  14. 测试ip 或者 ip+端口 是否畅通
  15. 【蜂口 | AI人工智能】人脸美颜——龙鹏 深度学习与人脸图像应用连载(八)
  16. vue 首页白屏优化
  17. 乐华娱乐CEO杜华揭秘:捧红王一博 与孙一丁是配偶同居关系
  18. [软件人生]也谈谈支付宝五福
  19. 契约锁助力上市公司IPO申报 信息披露、重大事项决策等文件网上签
  20. Android usb-serial-for-android驱动库 实现(读卡器rs232串口转usb)插入开发板读取数据

热门文章

  1. WAN killer
  2. windows利用iis配置反向代理实现ECS内网互通oss
  3. Linux 异步IO
  4. Qt笔记——MOC(莫克)
  5. 90后黄金程序员,你不是码农,请自信
  6. Python自然语言处理学习笔记(23):3.7 用正则表达式文本分词
  7. 兼容IE和FF的js脚本做法
  8. 修改Win7启动顺序和启动菜单名称
  9. 基于SSM实现旅游住宿和导游系统
  10. 宝塔控制面板如何添加伪静态