IOC/DI概念简述及基本应用
早几年面试时,面试官经常问我依赖注入的概念,但有面试官自己都不是很清楚ioc和di的区别,而是草草归于一类,今天翻了翻以前写的demo,顺便把这部分概念整理出来,加深一下印象。
先科普一下,IOC是什么
IOC(Inversion of Control)又称控制反转,它并不是指某种技术实现,而是OOP的一种设计原则。
这个概念基础不牢靠的同学很多都是和DI混淆的,包括我曾经遇到几个面试官也是这样(面试过程极其尴尬),这里着重强调。
为什么叫控制反转?传统程序设计中,我们经常使用 new 创建对象,这种做法是我们主动去创建依赖对象,可以理解为“正转”。
如果把创建对象(new)的操作移交给某个程序(IOC容器)来控制,就理解为“反转”。也就是说,就是把创建对象交给IOC容器去做,将控制权反转给IOC容器。
什么是DI
DI(Dependency Injection)又称依赖注入,是IOC的一种实现方式。
言简意赅的讲,由容器动态创建依赖关系并注入到组件中去。依赖注入并不能给程序带来更多功能,却可以提升组件重用率、系统可扩展性,让程序更灵活。
.Net Core的实现
net core自带IOC容器(也许你听过这一句:一切皆注入),只需要简单配置即可使用。
先新建一个core项目,然后编写接口和实现类:
public interface IProduct
{
void Get();
} public class Product : IProduct
{
public void Get()
{
throw new NotImplementedException();
}
}
之后进入Startup进行配置:
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IProduct, Product>();
}
接下来是代码环节:
public class Test
{
private IProduct Pro { get; set; } public UserController(IProduct pro)
{
Pro = pro;
} public void Get()
{
//实现
Pro.Get();
}
}
别走,还没完
还有一个点需要注意,那就是生命周期。一般来说,既然问到了IOC,那么生命周期必然也会引出,所以一定要搞清楚。
生命周期有三种:
(单例模式)Singleton:首次请求创建,之后所有请求都沿用这个已创建的服务。
(瞬态模式)Transient:每次请求都创建,上面的代码里就是这种模式。
(作用域模式)Scoped:每次请求创建,同一个请求内不管调用多少次都只会被创建一次。
//瞬态
services.AddTransient<IProduct, Product>(); //作用域
services.AddScoped<IProduct, Product>(); //单例
services.AddSingleton<IProduct, Product>();
希望对大家有帮助。
IOC/DI概念简述及基本应用的更多相关文章
- Spring框架-IOC/DI详细学习
一.IOC/DI概念 参考博客:https://www.cnblogs.com/xdp-gacl/p/4249939.html IOC(inversion of control, 控制反转)是一种设计 ...
- Spring+IOC(DI)+AOP概念及优缺点
Spring pring是一个轻量级的DI和AOP容器框架. 说它轻量级有一大部分原因是相对与EJB的(虽然本人从没有接触过EJB的应用),重要的是,Spring是非侵入式的,基于spring开发的应 ...
- Spring.Net---2、IoC/DI基本概念
---------------------------------------------------------------------------------- (1)IoC/DI的概念 IoC ...
- JavaWeb_(Spring框架)Spring中IoC与DI概念入门
Spring是于2003 年兴起的一个轻量级的Java 开源框架,它由Rod Johnson创建.传统J2EE应用的开发效率低,Spring作为开源的中间件,提供J2EE应用的各层的解决方案,Spri ...
- Spring IOC/DI和AOP原理
一 IOC/DI 1. 概念机原理 IOC: Inversion of Control(控制反转)是一种设计思想,就是容器控制应用程序所需要外部资源的创建和管理,然后将其反转给应用程序.对象及其依赖对 ...
- 深入理解IoC/DI
------------------------------------------------------------------------ 理解IoC/DI 1.控制反转 --> 谁控制谁 ...
- IoC/DI基本思想的演变
---------------------------------------------------------------------------------- (1)IoC/DI的概念 IoC ...
- 工厂方法模式与IoC/DI
IoC——Inversion of Control 控制反转 DI——Dependency Injection 依赖注入 1:如何理解IoC/DI 要想理解上面两个概念,就必须搞清 ...
- spring--学习之IOC DI
2.1.1 IoC是什么 Ioc-Inversion of Control,即"控制反转",不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器 ...
随机推荐
- WebForms UnobtrusiveValidationMode 需要“jquery”ScriptResourceMapping 异常详细信息: System.InvalidOperationException: WebForms UnobtrusiveValidationMode 需要“jquery”ScriptResourceMapping。请添加一个名为 jquery (区分大小写)的
WebForms UnobtrusiveValidationMode 需要“jquery”ScriptResourceMapping.请添加一个名为 jquery (区分大小写)的 ScriptRes ...
- js函数prototype属性学习(一)
W3school上针对prototype属性是这么给出定义和用法的:使您有能力向对象添加属性和方法.再看w3school上给的那个实例,如下图: 仔细一看,原来最基本的作用就是对某些对象的属性.方法来 ...
- 曹工说Spring Boot源码(29)-- Spring 解决循环依赖为什么使用三级缓存,而不是二级缓存
写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...
- Java实现 LeetCode 710 黑名单中的随机数(黑白名单)
710. 黑名单中的随机数 给定一个包含 [0,n ) 中独特的整数的黑名单 B,写一个函数从 [ 0,n ) 中返回一个不在 B 中的随机整数. 对它进行优化使其尽量少调用系统方法 Math.ran ...
- Java实现 LeetCode 37 解数独
37. 解数独 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗实 ...
- Java实现 蓝桥杯 历届真题 稍大的串
串可以按照字典序进行比较.例如: abcd 小于 abdc 如果给定一个串,打乱组成它的字母,重新排列,可以得到许多不同的串,在这些不同的串中,有一个串刚好给定的串稍微大一些.科学地说:它是大于已知串 ...
- java实现高斯日记
题目标题: 高斯日记 大数学家高斯有个好习惯:无论如何都要记日记. 他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210 后来人们知道,那个整数就是日期,它表示那一天是高斯 ...
- java实现奇怪的比赛
** 奇怪的比赛** 某电视台举办了低碳生活大奖赛.题目的计分规则相当奇怪: 每位选手需要回答10个问题(其编号为1到10),越后面越有难度.答对的,当前分数翻倍:答错了则扣掉与题号相同的分数(选手必 ...
- Java实现第九届蓝桥杯三体攻击
三体攻击 [题目描述] 三体人将对地球发起攻击.为了抵御攻击,地球人派出了 A × B × C 艘战舰,在太空中排成一个 A 层 B 行 C 列的立方体.其中,第 i 层第 j 行第 k 列的战舰(记 ...
- java代码(7) ---guava之Bimap
guava之Bimap bimap的作用很清晰:它是一个——映射,可以通过key得到value,也可以通过value得到key 一.概述 1.bimap和普通HashMap区别 (1)在java集合类 ...