博客
关于我
Spring的核心依赖注入(DI)和控制反转(IOC)
阅读量:619 次
发布时间:2019-03-13

本文共 878 字,大约阅读时间需要 2 分钟。

Spring Core

Spring的核心模块是一个容器,通过IOC或DI的方式来管理实例。Spring将每个实例都看作是一个Bean对象,通过工厂模式来创建对象,将创建的对象保存在IOC容器中。当需要使用到这个对象时,通过getBean()方法来获取该对象,并且对象是以单例的形式存在。

容器的工作模式

ApplicationContext接口在工程启动时读取resources下的.xml文件,获取需要管理的Bean实例。通过BeanFactory创建需要管理的Bean实例。业务调用时通过getBean方法从工厂中获取需要的实例来调用目标方法。容器中管理的Bean实例默认是单例。

控制反转(IOC)

为什么有控制反转

控制反转是为了降低对象间的耦合度。我们所涉及的多个对象之间相互依赖,类似于齿轮一样,一旦一个崩溃,整个系统都会崩溃。而IOC相当于一个第三方进行协调,齿轮之间不再相互依赖,而是都依赖于第三方。

为什么叫控制反转

以图1为例,A工作的完成依赖于B,A在初始化或运行到某个状态节点时,需要使用到B。无论是创建还是使用B,控制权都在A这里。而在引入了IOC后,当A需要B时,A告知“第三方”,那么第三方就会去主动创建一个B注入到A所需要的地方。对比两个过程,可以发现,A获得B的过程,从主动变成了被动,创建B的控制权在IOC手中,也就是控制反转了。

依赖注入(DI)

什么是依赖

如图1所示,A的运行需要使用到B,我们就说A依赖于B。

什么是依赖注入

依旧以图1为例,A依赖于B,但A并不主动创建依赖,而是通过外部传入对象的形式来设置依赖。主要有三种方式:构造器注入、setter方法注入、接口注入。

IOC和DI

IOC和DI实际上描述的是同一件事实(对象实例化及依赖关系维护),并为的是同一个目的(降低程序耦合度),只是两者的角度不同。 - IOC站在对象的角度,容器进行对象实例化和管理实例。 - DI站在容器的角度,使容器将对象依赖的其他对象注入。 - IOC是一种解耦合的思想,而DI是这种思想的一种实现方式,是一个涉及模式。

转载地址:http://xwgaz.baihongyu.com/

你可能感兴趣的文章
kali安装docker(亲测有效)
查看>>
Linux系列:Linux目录分析:[/] + [/usr] + [/usr/local] + [/usr/local/app-name]、Linux最全环境配置 + 动态库/静态库配置
查看>>
Linux系列:ubuntu各版本之间的区别以及Ubuntu、kubuntu、xUbuntu、lubuntu等版本区别及界面样式
查看>>
mysql系列:远程连接MySQL错误“plugin caching_sha2_password could not be loaded”的解决办法
查看>>
Nessus扫描结果出现在TE.IO或者ES容器结果查看问题解决方案
查看>>
Nmap渗透测试指南之探索网络
查看>>
Nmap渗透测试指南之防火墙/IDS逃逸、信息搜集
查看>>
Nmap端口服务 之 CentOS7 关于启动Apache(httpd)服务、telnet服务、smtp服务、ftp服务、sftp服务、snmp服务
查看>>
PHP系列:PHP 基础编程 2(时间函数、数组---实现登录&注册&修改)
查看>>
PHP系列:使用PHP实现登录注册功能的完整指南
查看>>
Python&aconda系列:cmd/powershell/anaconda prompt提示“系统找不到指定的路径”(亲测有效)
查看>>
Python&aconda系列:conda踩坑记录2.UnsatisfiableError: The following specifications were found to be incompa
查看>>
Python&aconda系列:Jupyter Notebook快速上手、深度学习库PyTorch安装
查看>>
Python&aconda系列:(W&L)Conda使用faiss-gpu报错及解决办法、安装numpy的坑、cmd执行Python脚本找不到第三方库、安装tensorflow-gpu时遇到的from
查看>>
python&anconda 系列:Pycharm在debug问题的N种解决方案(一般程序、web方向、人工智能方向)
查看>>
python&anconda系列(亲测有效):tensorflow AttributeError: ‘str’ object has no attribute ‘decode’
查看>>
python&anconda系列:tf.keras.backend.get_session()和keras.backend.get_会话()返回不同的会话对象(待解答)
查看>>
"WARNING: Increasing RAM size to 1GB" and "Cannot set up guest memory 'xxx.ram': Invalid argument".
查看>>
#if 0 #elif 1 #else #endif 用法
查看>>
#include <gdiplus.h>出错
查看>>