IOC控制反转理解

IOC控制反转理解1 IOC 基础 IOC 全称 InversionOfC 中文翻译是控制反转的意思 初学 Spring 绕不过去的一个弯 需要好好理解 IOC 的思想 网上看了很多博客 也看了很多网课 但是还是云里云雾 终于看到一个容易理解的例子 写下自己对 IOC 的理解 2 IOC 推导与理解首先编写一个基本的项目 结构如下 有一个 Meizi 妹子 接口 里面有一个方法 describe 编写四个类 四种类型的妹子 Yujie 御姐 Luoli 萝莉 Xuemei 学妹 NvWang 女王 类

1. IOC基础

IOC:全称Inversion Of Control,中文翻译是控制反转的意思。初学Spring绕不过去的一个弯,需要好好理解IOC的思想。网上看了很多博客,也看了很多网课,但是还是云里云雾。终于看到一个容易理解的例子,写下自己对IOC的理解。

2. IOC推导与理解

首先编写一个基本的项目,结构如下:

  1. 有一个Meizi(妹子)接口,里面有一个方法describe。
  2. 编写四个类(四种类型的妹子):Yujie(御姐)、Luoli(萝莉)、Xuemei(学妹)、NvWang(女王)类实现Meizi接口,重写describe方法。
  3. 一个Nan(男生)接口,里面有一个方法getMeizi。
  4. 编写两个类:yihao(一号男生)、erhao(二号男生)实现Nan接口,重写getMeizi方法。

为了简单方便将所有的类实现都放在一个代码块中,这里利用男生找对象的方式进行理解IOC的含义。

2.1、最基本的实现方式
interface Meizi { 
      public void describe(); } class Yujie implements Meizi{ 
      @Override public void describe() { 
      System.out.println("御姐~"); } } //这里只列出一种女生类型的具体实现,其他的类似 interface Nan { 
      public void getMeizi(); } class yihao implements Nan{ 
      @Override public void getMeizi() { 
      Meizi meizi = new Yujie(); meizi.describe(); } } class erhao implements Nan{ 
      @Override public void getMeizi() { 
      Meizi meizi = new Yujie(); meizi.describe(); } } 

在这里插入图片描述
现在整个实现是上图所示,getMeizi方法内部依赖四种类型的妹子。

  1. 很容易看到这种设计方式违背了OOP的设计原则,至少违背了迪米特法则。我们不应该将一个陌生类(接口)作为局部变量!
  2. 没有改动的余地,现在男生都想找一个御姐对象,如果需求变更男生想找一个女王呢?是不是需要更改所有男生的代码?

2.2、采用组合的方式实现

假设男生最开始都有一个御姐类型的女朋友

interface Meizi { 
       public void describe(); } class Yujie implements Meizi{ 
       @Override public void describe() { 
       System.out.println("御姐~"); } } //这里只列出一种女生类型的具体实现,其他的类似 interface Nan { 
       public void getMeizi(); } class yihao implements Nan{ 
       private Meizi meizi = new Yujie(); @Override public void getMeizi() { 
       meizi.describe(); } } class erhao implements Nan{ 
       private Meizi meizi = new Yujie(); @Override public void getMeizi() { 
       meizi.describe(); } } public class Main { 
       public static void main(String[] args) { 
       yihao man1 = new yihao(); man1.getMeizi(); erhao man2 = new erhao(); man2.getMeizi(); } } 

在这里插入图片描述
采用组合关系之后如上图,现在真正的问题来了:

  1. 组合关系:什么是组合关系?谁也离不开谁、二者之间是一个整体;比如:脑袋和身体这种关系;叫组合关系。
  2. 男一号、男二号能保证自己以后一定会跟御姐妹子走到最后吗?或者说二者之间一定不会分手吗?组合关系限定死了男一号、男二号更换对象的权利,他们没有权利在更换对象了!当然御姐妹子也没有权利更换男朋友了!
  3. 如果想跟换对象是需要重新去修改源代码,重新new一个对象。
  4. 这个代码设计也不好,男生、女生都丧失了更换对象的权利。耦合度太高了,硬生生的将两个人绑在了一起。

2.3、采用聚合方式(松耦合)

组合方式限定死了男生的对象、没有办法更换。现在将组合方式改为聚合,不在内部直接new一个确定的对象(主动创建)。而是通过set方法给男生一个女朋友(被动接受)。

interface Meizi { 
        public void describe(); } class Yujie implements Meizi{ 
        @Override public void describe() { 
        System.out.println("御姐~"); } } //这里只列出一种女生类型的具体实现,其他的类似 interface Nan { 
        public void getMeizi(); } class yihao implements Nan{ 
        private Meizi meizi; public void setMeizi(Meizi meizi) { 
        this.meizi = meizi; } @Override public void getMeizi() { 
        meizi.describe(); } } class erhao implements Nan{ 
        private Meizi meizi; public void setMeizi(Meizi meizi) { 
        this.meizi = meizi; } @Override public void getMeizi() { 
        meizi.describe(); } } public class Main { 
        public static void main(String[] args) { 
        yihao man1 = new yihao(); man1.setMeizi(new Yujie()); man1.getMeizi(); erhao man2 = new erhao(); man2.setMeizi(new Luoli()); man2.getMeizi(); } } 

在这里插入图片描述
通过set注入方式就可以实现解耦。

  1. 假定IOC是一个婚介所,现在男女生都婚介所登记资料,男生告诉IOC需要什么样的对象,IOC就给男生一个。
  2. 由男生主动搭讪妹子寻找对象(new),演变成了被动的由婚介所介绍对象(set注入)!
  3. 到此IOC就是大概一个这样的概念:控制反转,反转的是创建对象的方式,由主动化为被动的一个过程。

3. IOC总结

在这里插入图片描述
控制 : 谁来控制对象的创建 , 传统应用程序的对象是由程序本身控制创建的 , 使用Spring后 , 对象是由Spring的IOC容器来创建的

反转 : 程序本身不创建对象 , 而变成被动的接收对象 .








版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/226262.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午11:57
下一篇 2026年3月16日 下午11:58


相关推荐

  • Jlink或者stlink用于SWD接口下载程序

    Jlink或者stlink用于SWD接口下载程序最近要使用stm32f103c8t6最小系统板,直接ISP串口下载程序太麻烦,就想着使用swd接口来调试。结果:通过SWD接口下载程序成功,但调试失败,还不知原因,会的的人麻烦交流一下。SWD接口:3.3VDIO(数据)CLK(时钟)GND1.首先声明jlink和stlink都有jtag和swd调试功能。jlink接口如下:如图,我使用的就是VCC…

    2022年4月25日
    78
  • 经济基础知识(中级)【2】

    经济基础知识(中级)【2】1.下列经济活动中,会导致企业现金流入的有()。A.购买原材料B.用固定资产对外投资C.对外投资D.收到银行贷款E.销售商品2.下列义务中,属于公司股东法定义务的有()。A.遵守公司章程B.缴纳所认缴的出资C.忠实义务D.勤勉义务E.公司设立登记后,不得抽回出资3.会计确认应该符合一定的标准,企业在确认收入时应当坚持的标准有()。A.及时确认B.取得收入权利的交易已经发生C.按照权责发生制要求进行确认D.取得资产所有权的交易已经发生E.年底统一确认4.下列统计

    2022年5月8日
    62
  • 软件测试:系统测试之因果图方法

    软件测试:系统测试之因果图方法来源:http://blog.csdn.net/vincetest一.    方法简介1.定义:是一种利用图解法分析输入的各种组合情况,从而设计测试用例的方法,它适合于检查程序输入条件的各种组合情况。2.因果图法产生的背景:等价类划分法和边界值分析方法都是着重考虑输入条件,但没有考虑输入条件的各种组合、输入条件之间的相互制约关系。这样虽然各种输入条件可能出错的情况已经测试到了,但多个输入条件组合起…

    2022年8月14日
    4
  • 关于RecyclerView的notifyDataSetChanged

    关于RecyclerView的notifyDataSetChanged在很久以前,总觉得ListView的notifyDataSetChanged之类的方法很神奇,数据更新后,调用一下,视图就变了…不过自从知道观察者模式以后就没感觉么神奇了,反而对View的绘制测量一系列精细的计算叹为观止—虽然从某种程度上来说,Android的源代码其实挺臃肿的。后面推出了RecyclerView,但其实更新机制并无不同。就如调用notifyDataSetChanged方法:…

    2022年6月29日
    29
  • Agent 到底是什么?和 ChatGPT 有什么不同?

    Agent 到底是什么?和 ChatGPT 有什么不同?

    2026年3月14日
    3
  • 文心一言4.5开源模型实战:ERNIE-4.5-0.3B轻量化部署指南与效能优化

    文心一言4.5开源模型实战:ERNIE-4.5-0.3B轻量化部署指南与效能优化

    2026年3月12日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号