关于IOC容器的一些个人理解
一丶前言
下面是本人对于IOC容器的一些个人理解,希望能帮到初学者认识IOC,如有理解得不对的地方欢迎指正,也让我学学。
二丶IOC是什么,它是干嘛的?
IOC只是一种编程思想,不局限于任何一种语言,任何语言都可以实现这种编程思想。它的设计思想是想把创建对象,管理对象生命周期,程序集之间的解耦的工作交给第三方容器来处理。传统的方式都是自己new一个对象,然后在写一个公共类去维护这个对象的生命周期,例如单例对象,static静态对象,同一个HTTP请求使用同一个对象等等,这些功能如果不用ioc容器组件,那就要自己写代码实现。
用了IOC组件之后这些操作就交由第三方ioc容器组件来处理,你只需要把对象塞进容器里,并告诉容器这个对象的生命周期就可以了。这种思想是符合未来发展趋势,专业的事交给专业的人来做,分工明确。
IOC是思想,实现这个思想的组件有Autofac,Castle Windsor,Unity,Spring.NET,StructureMap,Ninject,他们的功能类似,我用的最多的是Autofac和StructureMap,推荐使用Autofac,StructureMap作者很久没有更新了,下面文章的例子也是用Autofac来实现的。
三丶IOC容器Autofac使用流程图
四丶Autofac使用流程例子
1.注册对象到容器中的流程:
这里有个要注意的地方,如果判断自己注册对象是否真正的在容器中了,这个可以用上面的方法,查询容器中是否包含了指定名字,如果查询到了说明你注册成功了。
如果这里没注册不成功,你在构造中注入会报错,上面的方法可以帮助你排查问题。
2.从容器中取出对象使用的流程
这里使用的是构造函数注入:
扯一下,为啥必须EF在同一次请求里或者是同一个线程里必须用同一个EF上下文:
同一次请求可能包含对数据库的不同操作,其他的EF对象内获取的数据可能已经是过时的,如果不保证同一个请求中使用同一个EF上下文对象,事务工作单元模式将无法实现。而且可能造成数据混乱。
五丶如何验证对象的生命周期
你们会看到同时两个请求,guid会来回切换,因为他们所处的线程上下文在切换,下次请求guid还是一个新的,这个证明了这个ef上下文是同一个请求中使用的是同一个对象,说明注册的生命周期是有效的。
这个例子可能不那么直观,你们可以自己注册一个单例对象,或者静态对象测试一下就明白了。
六丶结语
依赖注入,控制反转感觉没啥讲的,理解上面的ioc容器是啥东西,他能干嘛,使用ioc容器已经没啥问题了,等我有空再把AOP切面编程和ioc解耦说下我个人的理解。
五丶Github Demo,演示地址
演示地址:http://gaobili.cn:8600/swagger/index.html
加群一起学习共同进步。群号:963718093
关于IOC容器的一些个人理解的更多相关文章
- 初始化IoC容器(Spring源码阅读)-我们到底能走多远系列(31)
我们到底能走多远系列(31) 扯淡: 有个问题一直想问:各位你们的工资剩下来会怎么处理?已婚的,我知道工资永远都是不够的.未婚的你们,你们是怎么分配工资的? 毕竟,对自己的收入的分配差不多体现了自己的 ...
- 初始化IoC容器(Spring源码阅读)
初始化IoC容器(Spring源码阅读) 我们到底能走多远系列(31) 扯淡: 有个问题一直想问:各位你们的工资剩下来会怎么处理?已婚的,我知道工资永远都是不够的.未婚的你们,你们是怎么分配工资的? ...
- 深入理解DIP、IoC、DI以及IoC容器
摘要 面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序.其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC.DI以及Ioc容器等概念.通过本文我们将一起学 ...
- 基于nutz框架理解Ioc容器
同样我们从问题入手去验证以及去理解Ioc容器都做了哪些事情: 1.nutz是有几种方式获取需要容器管理bean的信息? 第一种是使用json格式的文件进行配置,如: 第二种:使用注解@IocBean ...
- 深入理解DIP、IoC、DI以及IoC容器(转)
深入理解DIP.IoC.DI以及IoC容器 摘要 面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序.其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC.D ...
- 【转】深入理解DIP、IoC、DI以及IoC容器
原文链接:http://www.cnblogs.com/liuhaorain/p/3747470.html 前言 对于大部分小菜来说,当听到大牛们高谈DIP.IoC.DI以及IoC容器等名词时,有没有 ...
- 再看IOC, 读深入理解DIP、IoC、DI以及IoC容器
IoC则是一种 软件设计模式,它告诉你应该如何做,来解除相互依赖模块的耦合.控制反转(IoC),它为相互依赖的组件提供抽象,将依赖(低层模块)对象的获得交给第三方(系统)来控制,即依赖对象不在被依赖模 ...
- IOC容器在web容器中初始化过程——(二)深入理解Listener方式装载IOC容器方式
先来看一下ContextServletListener的代码 public class ContextLoaderListener extends ContextLoader implements S ...
- Spring学习(一):理解IoC容器
序言 记得刚毕业那会儿,出来招工作被问到Spring的核心时,都觉得简单的一笔,直接说不就是IoC(控制反转)和DI(依赖注入)么,然后省略一万字对两个名词的解释.最近空来整理了一下Spring中Io ...
随机推荐
- javaWeb项目中的路径格式 请求url地址 客户端路径 服务端路径 url-pattern 路径 获取资源路径 地址 url
javaweb项目中有很多场景的路径客户端的POST/GET请求,服务器的请求转发,资源获取需要设置路径等这些路径表达的含义都有不同,所以想要更好的书写规范有用的路径代码 需要对路径有一个清晰地认知 ...
- [图解]ARP协议(一)
一.ARP概述 如果要在TCP/IP协议栈中选择一个"最不安全的协议",那么我会毫不犹豫把票投给ARP协议.我们经常听到的这些术语,包括"网络扫描"." ...
- js for循环删除两个数组相同元素
var id = ['a','b','c','a','d','a','a','b','d','c','a','b','c','a','b','c'] var del = ['a','c']; var ...
- 【转】ASP.NET MVC实现权限控制
这篇分享一下 ASP.NET MVC权限控制.也就是说某一用户登录之后,某一个用户是否有权限访问Controller,Action(操作),视图等 想实现这些功能,需要在数据库创建好几个表:[User ...
- MySql 注意点
每条操作语句的结束都要加:(遇到:就会执行操作) DELIMITER 其实本身相当 :当存储过程中包含:的时候,就需要用 DELIMITER 来区分 我们会经常看到 DELIMITER $$ 或者DE ...
- JS截取数字
Math是javascript的一个内部对象,该对象的方法主要是一些数学计算方法floor:下退 Math.floor(12.9999) = 12ceil:上进 Math.ceil(12.1) = 1 ...
- float浮动-清浮动BFC渲染机制
float浮动,用于横向布局. 起初的横向布局都用display:inline-block,但是这会导致两个元素之间有空隙,而这是由代码换行解析成空格的,解决元素间有空隙,空格:font-size:0 ...
- alfs学习笔记-自动化构建lfs系统
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 一名linux爱好者,记录构建Linux From Scratch的过程 经博客园-骏马金龙前辈介绍,开始接触学习lfs,用博客 ...
- [HTML/CSS]colum-gap属性
属性定义及使用说明 column-gap的属性指定的列之间的差距. 注意: 如果指定了列之间的距离规则,它会取平均值. 语法 column-gap: length|normal; 值 描述 l ...
- ArcGIS API for JavaScript 4.2学习笔记[20] 使用缓冲区结合Query对象进行地震点查询【重温异步操作思想】
这个例子相当复杂.我先简单说说这个例子是干啥的. 在UI上,提供了一个下拉框.两个滑动杆,以确定三个参数,使用这三个参数进行空间查询.这个例子就颇带空间查询的意思了. 第一个参数是油井类型,第二个参数 ...