IoC概要
控制反转基本上说的是功能调用者与功能实现者之间应该如何交互,即二者之间没有直接的强耦合(调用者new一个被调用者),而是都依赖同一个抽象,这个抽象规定了二者交互的接口。反转的意思是实现了依赖倒置,在程序中高层不是根据低层的接口来写调用,而是倒过来,高层根据需要定义接口,低层向上负责实现这个接口。这体现了自顶向下的设计思路和自底向上的实现方法,使软件代码具有自然的可读性,以及关注点的分离。
IoC容器是实现IoC的框架,具体包括了接口与实现的关系配置功能和获取实现对象的功能,其中获取实现对象的功能大体对应了设计模式中的工厂模式,下面简要分析对比一下原生态new调用,工厂模式调用,和IoC容器调用:
为了对比方便,在分析原生态调用之前先假设一个前提,那就是功能被某个具体的类实现了。直接调用有最好的性能,但可维护性和可测试性很差,比如想要修改一个功能的实现,有2种实现方法A和B,A是一个巨大的改变,也就是适合于新写一个类来实现,B是一个较小的改变,可以直接修改类的内部结构。假如用A方案,而系统又有多处引用,甚至还需要注意构造函数及其参数的变化,那么意味着多个修改量,这违背了TRY原则,对开发是一个负担。假如使用了B方案,那就要注意内部实现的改变是否会影响外部环境,是否有使修改不封闭的地方。而可测试性就不必多说了,因为是直接new的,所以无法Moq,导致无法完美的做单元测试。
当直接用工厂模式时,需要先做抽象,即把功能代码分成抽象和实现两部分,功能调用者调用工厂提供的方法获得具体的实现对象,这确保了系统是面向接口编程的,帮助编程者写出高内聚低耦合的逻辑。同时也引发了一些问题,比如可能有较多的工厂类需要维护,功能调用者与工厂类之间又有耦合,假如用抽象工厂模式来解耦,又需要增加配置文件的内容。
使用IoC容器可以非常方便的定义符合某个接口的实现对象的获取策略,能够对对象的生命周期做配置和管理,而无需编写和维护工厂代码,拥有最佳的可维护性和可测试性。
IoC概要的更多相关文章
- Spring MVC 学习总结(一)——MVC概要与环境配置
一.MVC概要 MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范,用一种将业务逻辑.数据.显示分离的方法组织代码,MVC主要作用是降低了视图与业务 ...
- 《Spring敲门砖之基础教程第一季》 第一章 概要介绍
百度百科say: Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建.简单来说,Spring是一个分层的JavaSE/EEful ...
- Spring MVC 学习总结(八)——Spring MVC概要与环境配置(IDEA+Maven+Tomcat7+JDK8、示例与视频)
一.MVC概要 MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范,用一种将业务逻辑.数据.显示分离的方法组织代码,MVC主要作用是降低了视图与业务 ...
- Spring MVC 学习总结(一)——MVC概要与环境配置 转载自【张果】博客
Spring MVC 学习总结(一)--MVC概要与环境配置 目录 一.MVC概要 二.Spring MVC介绍 三.第一个Spring MVC 项目:Hello World 3.1.通过Mave ...
- Spring MVC 学习总结(一)——MVC概要与环境配置(IDea与Eclipse示例)
一.MVC概要 MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范,用一种将业务逻辑.数据.显示分离的方法组织代码,MVC主要作用是降低了视图与业务 ...
- .net core 中的 DependencyInjection - IOC
概要:因为不知道写啥,所以随便找个东西乱说几句,嗯,就这样,就是这个目的. 1.IOC是啥呢? IOC - Inversion of Control,即控制反转的意思,这里要搞明白的就是,它是一种思想 ...
- IOC的使用
1.概要: 在spring中,都是使用反射机制创建对象,将创建对象的权利交给spring容器,就是控制反转(ioc) 对象创建方式 有参构造 无参构造 工厂模式(静态,非静态) 2.创建IDEA控制台 ...
- ADO.NET .net core2.0添加json文件并转化成类注入控制器使用 简单了解 iTextSharp实现HTML to PDF ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下 C# AutoMapper 了解一下
ADO.NET 一.ADO.NET概要 ADO.NET是.NET框架中的重要组件,主要用于完成C#应用程序访问数据库 二.ADO.NET的组成 ①System.Data → DataTable, ...
- Spring IOC初始化深度解析
1.前言 本文是基于JAVA配置方法对Spring IOC进行分析,掌握Spring IOC初始化流程对于我们更好的使用Spring.学习Spring还是很有帮助的,本文所使用的的Spring版本为5 ...
随机推荐
- Callable接口使用以及计算斐波那契数字的数值总和
一.简单使用 Runnable是执行工作的独立任务,但是它不返回任何值.如果你希望任务完成的时能够返回一个值,那么可以实现一个Callable接口.在Java SE5中引入的Callable是一种具有 ...
- Vue+WebPack游戏设计:自动背景贴图和游戏主循环的实现
- 高性能Web服务器Nginx的配置与部署研究(2)Nginx入门级配置与部署及“Hello World”
1. Nginx 程序包 目前最新的开发版本时1.1.12: Linux/Unix:nginx-1.1.12.tar.gz Windows:nginx-1.1.12.zip 我们可以下载稳定版尝试: ...
- ubuntu18.04 安装显卡驱动
1.使用PPA仓库进行自动化安装 sudo add-apt-repository ppa:graphics-drivers/ppa && sudo apt update 2.查询所有u ...
- Qt Setting Application Icon
Qt4 设置应用程序图标 将一个ico图标放在资源文件夹下; 然后建立txt,输入 IDI_ICON1 DISCARABLE "myico.ico"; 保存文件,将其后缀改为.rc ...
- VS2017与Qt5.7.0(静态库)环境基本配置
**************************************************************************************************** ...
- smarty 使用php函数
strtotime() time() <{if strtotime($activity.start_time) gt time()}> <a href="?action=d ...
- png 深度图像 转为 点云(opencv2)
https://github.com/kruglov-dmitry/pnd2pcd_batch
- 无归档情况下使用BBED处理ORA-01113错误
在丢失归档情况下,恢复时常会遇到ora-01113错误,以下实验模拟表空间offline,然后在丢失归档文件的情况下使用BBED修改文件头信息,最后恢复数据文件: 数据库版本: SQL> sel ...
- Jrebel 独立部署tomcat 远程同步项目
一直在用 jrebel 感觉热部署的 功能,修改xml配置文件等,省去了很多的重新启动的时间. 由于偶然间发现 jrebel 还有remote 路由功能.这样,在服务器端用jrebel部署的项目和本地 ...