学习地址:腾讯课堂   https://ke.qq.com/course/28986?_bid=167&_wv=3&from=iosapp

1.什么是IOC容器
  定义:
    1.是一个可以把面向细节编程方式,转变为面向抽象编程方式的第三方容器(工厂模式差不多)

    2.可以用来自动化创建对象的容器(利用DI依赖注入和配置文件的手段来实现)

  遵循依赖倒置原则:
    高层不直接依赖底层的细节,而是通过抽象来依赖,也就是所谓的把面向细节编程变为面向抽象编程

  IOC控制反转:
    把高层对底层的依赖去掉,对象的控制权转移到第三方容器,让程序更具有扩展性

  DI依赖注入:
    实现IOC的一种手段,构造对象时,把依赖的对象自动创建并传入进去

  DI依赖注入的先后顺序:
    构造函数注入-->属性注入-->方法注入

2.为什么要用IOC容器
  面向细节编程:
    当我们面向细节编程的时候,如果细节变化了(扩展了),那么高层也需要改变,程序中往往底层的细节是容易改变的,这样会导致程序架构不稳定(往往我们的程序是不止一层的)

  面向抽象编程:
    当我们面向抽象编程的时候,如果细节变化了(扩展了),高层时不需要改变,这样阻止了程序升级时的水波效应,使程序架构更加稳定

  例如(随便举例子):

    手机类如下:

public class Iphone
{
public void Play()
{
Console.WriteLine("我在玩iphone");
}
} public class VIVO
{
public void Play()
{
Console.WriteLine("我在玩vivo");
}
}

    学生类如下:

public class Student
{
public void Play(IMobile iphone)
{
iphone.Play();
} } 

    现在我们创建一个学生,并让学生玩iphone(面向细节)

//我们通过买一款iphone手机玩
public Unity_Test1()
{
Student stu = new Student();
Iphone iphone = new Iphone();
stu.Play(iphone);
}

    到后面这个学生想玩vivo手机了,不想玩iphone,那么我们需要改低层的 Play(Iphone iphone)方法,应为它接受的是一个Iphone类型的参数,同时我们还需要改Unity_Test1类中的代码

    我们可以使用多态来解决此问题

      先定义一个接口,并让上面2款手机继承此手机接口,并把

public interface IMobile
{
void Play();
}

      代码如下(多态:里氏替换原则):

Student stu = new Student();
IMobile iphone = new Iphone();
stu.Play(iphone);

      想玩vivo手机了,不想玩iphone,这下我们只需要更改  IMobile iphone = new Iphone();   此句话即可

public Unity_Test1()
{
Student stu = new Student();
IMobile iphone = new VIVO();
stu.Play(iphone);
}

      注意:这里还是是依赖了细节(IMobile iphone = new VIVO();),并不满足依赖倒置原则(面向抽象,而不是面向细节)

3.如何实现依赖倒置原则

  问题:

    不依赖细节,那么我们如何创建对象呢?

  

  解决:

    把创建对象的事情交给第三方去实现

  方式如下:

    1)使用工厂模式

    2)使用IOC容器

1.初步了解IOC容器的更多相关文章

  1. [Spring学习笔记 1 ] Spring 简介,初步知识--Ioc容器详解 基本原理。

    一.Spring Ioc容器详解(1) 20131105 1.一切都是Bean Bean可是一个字符串或者是数字,一般是一些业务组件. 粒度一般比较粗. 2.Bean的名称 xml配置文件中,id属性 ...

  2. spring源码学习之路---深度分析IOC容器初始化过程(四)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 最近由于工作和生活,学习耽搁 ...

  3. Spring IOC容器分析(3) -- DefaultListableBeanFactory

    上一节介绍了封装bean对象的BeanDefinition接口.从前面小结对BeanFactory的介绍中,我们知道bean对象是存储在map中,通过调用getBean方法可以得到bean对象.在接口 ...

  4. ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器)

    前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ...

  5. ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)

    前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ...

  6. 【Spring源码解析】—— 结合SpringMVC过程理解IOC容器初始化

    关于IOC容器的初始化,结合之前SpringMVC的demo,对其过程进行一个相对详细的梳理,主要分为几个部分: 一.IOC的初始化过程,结合代码和debug过程重点说明 1. 为什么要debug? ...

  7. 初步理解IOC和DI和AOP模式

    初步理解IOC和DI和AOP模式 控制反转(IOC) 控制反转(IOC,Inversion of Control)是一种转主动为被动关系的一种编程模式,有点类似于工厂模式,举个栗子, 下面这个这不是I ...

  8. 转 Spring源码剖析——核心IOC容器原理

    Spring源码剖析——核心IOC容器原理 2016年08月05日 15:06:16 阅读数:8312 标签: spring源码ioc编程bean 更多 个人分类: Java https://blog ...

  9. Spring IoC容器与应用上下文的设计与实现

    一.前言 写这篇博文的主要目的如下: 通过相关类和接口分析IoC容器到底长什么样. 阐述笔者对Spring上下文和容器的理解. 介绍重要的类辅助理解SpringBoot的启动流程. 二.Spring ...

随机推荐

  1. Boyer-Moore

    Boyer-Moore 只做这些失败的匹配,就可以排除掉相应的对齐位置.在BM算法中,模式串P与文本串T的对准位置依然自左向右移动,而在对准位置确是自右向左的逐一比对各个字符串,具体的,在每一轮自右向 ...

  2. Pycharm的debug单步调试

    首先设置断点,点击行号显示的一侧,在指定行设置断点.比如这里,我们设断点在创建对象时: .如果这时我们直接右键run这个代码.他还是会直接运行,不会理会断点 结果 所以要右键选择run下面的debug ...

  3. 【leetcode】1020. Number of Enclaves

    题目如下: Given a 2D array A, each cell is 0 (representing sea) or 1 (representing land) A move consists ...

  4. Apache Flink 进阶(六):Flink 作业执行深度解析

    本文根据 Apache Flink 系列直播课程整理而成,由 Apache Flink Contributor.网易云音乐实时计算平台研发工程师岳猛分享.主要分享内容为 Flink Job 执行作业的 ...

  5. Codeforces 803E--Roma and Poker (DP)

    原题链接:http://codeforces.com/problemset/problem/803/E 题意:给一个n长度的字符串,其中'?'可以替换成'D'.'W'.'L'中的任意一种,'D'等价于 ...

  6. Eternal Victory

    题目链接 题意:给出n个点,再给出n-1条路,想一口气从1走完n个点的最小距离. 思路:好像它不构成环!md没看清题目,所以说每次遍历完全部的点后,最短的路就是每条边的距离*2减去最长路的距离. 所以 ...

  7. [CSP-S模拟测试]:大新闻(主席树)

    题目传送门(内部题20) 输入格式 第一行为两个数$n,m$,意义如题所述.接下来一行$n$个数,代表一开始$n$条大新闻的$naive$值.接下来$m$行,每行一个操作,输入格式如下:读入$1$,代 ...

  8. 文字在线中间,CSS巧妙实现分隔线的几种方法

    单个标签实现分隔线: .demo_line_01{ padding: 0 20px 0; margin: 20px 0; line-height: 1px; border-left: 200px so ...

  9. spring4.1.8扩展实战之二:Aware接口揭秘

    Aware.java是个没有定义任何方法的接口,拥有众多子接口,在spring源码中有多处都在使用这些子接口完成各种场景下的回调操作,当业务有需要时,我们只需创建类来实现相关接口,再声明为bean,就 ...

  10. VS2017/VS2019 git Authentication failed for "XXXXXXXXXx"

    解决办法: 控制面板,凭证管理==>删掉 对应代码仓库地址的凭证.删掉,是删掉.因为我更新了还是没有用.