前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何理解 Spring 的 IOC 思想?

如何理解 Spring 的 IOC 思想?

作者头像
一份执着✘
发布2018-06-04 17:27:58
1.6K0
发布2018-06-04 17:27:58
举报
文章被收录于专栏:赵俊的Java专栏赵俊的Java专栏

前言

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

是什么

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

为什么

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

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

代码语言:javascript
复制
public class Person {
    A a = new A();
    public void work() {
        a.xxx();
    }
}

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

代码语言:javascript
复制
public class Person {
    B b = new B();
    public void work() {
        b.xxx();
    }
}

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

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

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

代码语言:javascript
复制
public class Person {
    S s = new A();
    public void work() {
        s.xxx();
    }
}

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

代码语言:javascript
复制
public class Person {
    S s = new B();
    public void work() {
        s.xxx();
    }
}

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

怎么做

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

代码语言:javascript
复制
public class Person {
    S s;
    public void work() {
        s.xxx();
    }
}
代码语言:javascript
复制
<!--约束和一些配置略-->
<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 需求,如此可以方便的维护我们的代码。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-01-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 是什么
  • 为什么
  • 怎么做
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档