专栏首页赵俊的Java专栏如何理解 Spring 的 IOC 思想?

如何理解 Spring 的 IOC 思想?

前言

一说起 Spring 大家都知道 Spring 有两个思想,即 IOC 和 AOP,AOP 比较容易理解,但 IOC 却在我学习 Spring 很长一段时间之后才算理解,故在此记录下来,供其他学习者参考。

是什么

IOC 全称是 Inversion of Control ,是一种叫做 控制反转 的设计思想。 与之关联的是 DI 全称 Dependency Injection,即 依赖注入,IOC 容器通过 DI 来实现控制反转。 ps: 我知道你们也不想看这些总结性的概念,来看个例子吧。

为什么

那为什么需要用到 IOC 呢?先来看看我们之前是怎么写代码的。

例如在一个 Person 类中需要一个 A 类的对象,调用 A 类的方法来完成工作。

public class Person {
    A a = new A();
    public void work() {
        a.xxx();
    }
}

然后有一天出现了一个 B 类,B 类可以实现同样的功能,且效率更高。于是你改起了代码:

public class Person {
    B b = new B();
    public void work() {
        b.xxx();
    }
}

我们来看这样的方式,是不是有些死板呢,需要改的地方很多,如果 100 个类中都调用了这个类,那修改的工作量未免也太大了。

这时其实可以将 A 和 B 之间的特型抽象出一个接口出来,叫 S。 让 A 和 B 都实现 S 接口,

那么现在的代码就成这样了:

public class Person {
    S s = new A();
    public void work() {
        s.xxx();
    }
}

这时,如果我们如果想换成 B 类,只需要改很少的代码:

public class Person {
    S s = new B();
    public void work() {
        s.xxx();
    }
}

那么这样还有一个问题,就是如果 A 或 B 类需要设置一些参数,那么怎么办,再修改代码?那样耦合性还是太高了。

怎么做

这是就用到了 IOC,将所有的对象,交由 Spring 容器来管理,只需要在 Spring 的配置文件里修改到底需要哪个类即可。

public class Person {
    S s;
    public void work() {
        s.xxx();
    }
}
<!--约束和一些配置略-->
<bean id="A" class="package.A">
<bean id="B" class="package.B">
<bean id="person" class="package.Person">
    <property name="S" ref="A"/>  
  <!-- 或 <property name="S" ref="B"/>   -->
</bean>

如此就进行了进一步的解耦,其实完全可以把 Person 当作工作中的项目的 Service 类,而 A 和 B 是两个不同数据库的实现,或客户从 A 需求改到 B 需求,如此可以方便的维护我们的代码。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • LeetCode 654 Maximum Binary Tree

    一份执着✘
  • 巧用 MyBatis 构建树形结构

    一般的做法是查询出所有, 然后递归构建树形结构, 但其实可以巧用 MyBatis 在查询时就进行转换, 这用到了 MyBatis 的 resultMap 功能.

    一份执着✘
  • 移动零

    一份执着✘
  • 你真的会用Spring吗?如何在单例Bean中注入原型Bean

    假设单例 BeanA 需要使用原型 BeanB(BeanB 可能是 BeanA 的一个属性值)。可是容器仅创建一次单例 BeanA,因此只有一次机会来设置属性 ...

    Coder小黑
  • Spring Batch在大型企业中的最佳实践|洞见

    在大型企业中,由于业务复杂、数据量大、数据格式不同、数据交互格式繁杂,并非所有的操作都能通过交互界面进行处理。而有一些操作需要定期读取大批量的数据,然后进行一系...

    ThoughtWorks
  • 10年 Windows 与 Linux 程序员的区别

    如果一个程序员从来没有在Linux、Unix下开发过程序,一直在Windows下面开发程序,同样是工作10年,大部分情况下与在Linux、unix下面开发10年...

    小小科
  • 逻辑回归与梯度下降详解

    逻辑回归 Sigmoid函数: ? Sigmoid函数 梯度: ? 梯度的表达式 这个梯度是指:沿着x方向移动 ? 个单位,沿着y方向移动 ? 个...

    微风、掠过
  • DevOps 工程师成长日记系列五:部署

    如果在上图每列的技术栈上花费一个月左右的话,那么我们现在处于第 4 个月。基于前文的学习,我们已经知道了如何配置将要运行代码的服务器基础架构、如何正确地对代码进...

    CODING研发管理系统
  • Spring Boot JPA 中transaction的使用

    transaction是我们在做数据库操作的时候不能回避的一个话题,通过transaction,我们可以保证数据库操作的原子性,一致性,隔离性和持久性。

    程序那些事
  • 快速学习-Spring概述

    cwl_java

扫码关注云+社区

领取腾讯云代金券