一、IoC的基本概念

IoC全称Inversion of Control,即控制反转。它的核心技术是DI (Dependency Injection),即依赖注入。
什么是IOC?打个比方,我们要做一个系统,为客户提供股票新闻。通常我们需要从不同的新闻社订阅新闻来源,然后通过批处理程序定时到指定的新闻服务器抓取最新的股票新闻,接着保存数据库,最后在前端显示。代码如下:

public class FXNewsProvider
{private IFXNewsListener newsListener;private IFXNewsPersister newPersistener;public void getAndPersistNews(){String[] newsIds = newsListener.getAvailableNewsIds();if(ArrayUtils.isEmpty(newsIds)){return;}for(String newsId : newsIds){FXNewsBean newsBean = newsListener.getNewsByPK(newsId);newPersistener.persistNews(newsBean);newsListener.postProcessIfNecessary(newsId); }}
}

其中, FXNewsProvider 需要依赖 IFXNewsListener 来帮助抓取新闻内容,并依赖 IFXNews-
Persister 存储抓取的新闻。
假设默认使用道琼斯(Dow Jones)新闻社的新闻,那么我们相应地提供了 DowJonesNewsLis-
tener 和 DowJonesNewsPersister 两个实现。通常情况下,需要在构造函数中构造 IFXNewsProvider
依赖的这两个类:

public FXNewsProvider() {this.newsListener = new DowJonesNewsListener();this.newPersistener = new DowJonesNewsPersister();}

以往,如果我们依赖于某个类或服务,最简单而有效的方式就是直接在类的构造函数中新建相应的依赖类。我们都是自己主动地去获取依赖的对象!
IoC则是在我们需要时将某个依赖对象送过来,它的反转,就反转在让你从原来的事必躬亲,转变为现在的享受服务。

二、依赖注入

被注入对象又是通过哪些什么来通知IoC为其提供适当服务的呢?其实就是依赖注入!依赖注入主要有两种方式:1、构造方法注入;2、setter方法注入

2.1 构造方法注入

顾名思义,构造方法注入,就是被注入对象可以通过在其构造方法中声明依赖对象的参数列表,让IoC容器知道它需要哪些依赖对象。对于前面例子中的 FXNewsProvider 来说,只要声明如下构造方法即可支持构造方法注入。

public FXNewsProvider(IFXNewsListener newsListner,IFXNewsPersister newsPersister)
{this.newsListener = newsListner;this.newPersistener = newsPersister;
}

IoC会检查被注入对象的构造方法,取得它所需要的依赖对象列表,进而为其注入相应的对象。同一个对象是不可能被构造两次的,因此,被注入对象的构造乃至其整个生命周期,应该是由IoC来管理的。构造方法注入方式比较直观,对象被构造完成后,即进入就绪状态,可以马上使用。

2.2 setter 方法注入

当前对象只要为其依赖对象所对应的属性添加setter方法,就可以通过setter方法将相应的依赖对象设置到被注入对象中。以 FXNewsProvider 为例,添加setter方法后如下所示。

public class FXNewsProvider
{private IFXNewsListener newsListener;private IFXNewsPersister newPersistener;public IFXNewsListener getNewsListener() {return newsListener;}public void setNewsListener(IFXNewsListener newsListener) {this.newsListener = newsListener;}public IFXNewsPersister getNewPersistener() {return newPersistener;}public void setNewPersistener(IFXNewsPersister newPersistener) {this.newPersistener = newPersistener;}
}

这样,外界就可以通过调用 setNewsListener 和 setNewPersistener 方法为 FXNewsProvider 对象注入所依赖的对象了。
setter方法注入虽不像构造方法注入那样,让对象构造完成后即可使用,但相对来说更宽松一些,可以在对象构造完成后再注入。

2.3 两种注入方式的比较

构造方法注入的优点就是,对象在构造完成之后,即已进入就绪状态,可以马上使用。缺点就是,当依赖对象比较多的时候,构造方法的参数列表会比较长。而通过反射构造对象的时候,对相同类型的参数的处理会比较困难,维护和使用上也比较麻烦。而且在Java中,构造方法无法被继承,无法设置默认值。对于非必须的依赖处理,可能需要引入多个构造方法,而参数数量的变动可能造成维护上的不便。

setter方法注入因为方法可以命名, 所以setter方法注入在描述性上要比构造方法注入好一些。
另外,setter方法可以被继承,允许设置默认值,而且有良好的IDE支持。缺点当然就是对象无
法在构造完成后马上进入就绪状态。

三、IOC的优点

不使用IOC看上去照样可以实现功能,但是如果需求发生变化了,比如需求追加了处理另一家新闻社的新闻来源时,问题就来了。因为我们之前没有用IoC,所以,现在的对象跟 DowJonesNewsListener 是绑定
的,我们无法重用这个类了。
而使用IoC后,我们却完全可以不做任何改动,因为不管是DowJones还是MarketWin24,对于我们的系统来说,处理逻辑实际上应该是一样的。因此,我们只要根据MarketWin24的新闻服务接口,为MarketWin24的 FXNewsProvider 提供相应的 MarketWin24NewsListener 注入就可以了,见以下代码:

FXNewsProvider dowJonesNewsProvider = ➥
new FXNewsProvider(new DowJonesNewsListener(),new DowJonesNewsPersister());
...
FXNewsPrivider marketWin24NewsProvider = ➥
new FXNewsProvider(new MarketWin24NewsListener(),new DowJonesNewsPersister());
...

IoC是一种可以帮助我们解耦各业务对象间依赖关系的对象绑定方式!

Spring揭秘——什么是IOC和DI相关推荐

  1. Spring核心思想,IoC与DI详解(如果还不明白,放弃java吧)

    1.IoC是什么?IoC(Inversion of Control)控制反转,IoC是一种新的Java编程模式,目前很多轻量级容器都在广泛使用的模式.2.IoC解决了什么问题?在IoC出现以前,组件之 ...

  2. Spring框架02(IOC和DI)

    目录 spring中的IOC和DI 1. BeanFactory 容器 2. ApplicationContext 容器 1)ClassPathXmlApplicationContext 2)File ...

  3. 【Spring系列】 Spring注解方式实现IOC、DI及其Spring其他注解

    文章目录 注解回顾 JDK内置注解 自定义注解 1.声明一个注解类,由`@interface`修饰 2.通过元注解修饰注解的定义 `@Target`:(常用) `@Retention`:(常用) `@ ...

  4. Spring总结四:IOC和DI 注解方式

    首先我们要了解注解和xml配置的区别: 作用一样,但是注解写在Bean的上方来代替我们之前在xml文件中所做的bean配置,也就是说我们使用了注解的方式,就不用再xml里面进行配置了,相对来说注解方式 ...

  5. Spring是什么?IOC和DI详细介绍。

    Spring是什么 Spring是应用了很多优秀的设计模式,对于项目的实现,提供了优秀的解决方法;Spring是一个轻量级(低侵入)MVC和逻辑代码框架. 类与类之间的解耦合. Spring就像盖几十 ...

  6. Spring基本概念:IoC,DI,Wiring

    文章目录 一.IoC(控制反转) 二.DI(依赖注入) 三.Bean configuration(配置) 1. XML Schema-based configuration:基于XML模式的配置 2. ...

  7. Spring揭秘1:IOC容器、bean的生命周期

    1 依赖注入 在IoC模式中,被注入对象又是通过哪些方式来通知IoC Service Provider为其提供适当服务的呢?----依赖注入方式 构造方法注入 setter方法注入 接口注入 1.1 ...

  8. 王福强老师的《Spring揭秘》读后感-IOC容器之BeanFactory

    该代码基于Spring2.x 其中部分实现 在 Spring 4 中已经变化 但是基础的核心思想是不会变的... 直接上重点... 1.抽象的IOCProvider  这个抽象的理念 :用来管理bea ...

  9. 王福强老师的《Spring揭秘》读后感-IOC容器之ApplicationContext相关

    回忆一下ApplicationContext与BeanFactory的关系图 接下来讲述AppliactionContext实现的其他的接口与协议 Spring框架内部使用Resource接口作为所有 ...

  10. Spring中的Ioc、DI到底是啥

    我们都知道,Spring是一款轻量级的IOC框架,Spring的核心就是Ioc和DI,并通过俩者解耦. 那么,Ioc.DI呢? Ioc 控制反转 Ioc(Inversion of control)控制 ...

最新文章

  1. 理解Docker——深入引擎室
  2. 单链表的按位置插入和删除
  3. WordPress博客添加首页、文章页、页面、分类页、标签页的关键字和描述
  4. 边框回归:BoundingBox-Regression(BBR)(转)
  5. AcWing 859. Kruskal算法求最小生成树(稀疏图)
  6. 大学学计算机用游戏本好吗,大学学建筑学用什么配置的笔记本电脑好?
  7. python locust mqtt_Boomer 实战压测 mqtt,2w 并发轻松实现
  8. mysql给用户授权_mysql创建用户与授权(实例)
  9. 用ISO TOOL破解游戏 图文
  10. ISO14443A读卡流程(作为示例参考)
  11. 运营者想针对公众号吸粉做一些运营活动,怎么做?
  12. 蒸汽流量计算软件_海口气体腰轮订制,涡街流量计脉冲,期待合作
  13. 华为首部鸿蒙手机,液态镜头首次亮相亚美AM8探秘华为首部鸿蒙手机P50
  14. 【Micro USB选择指南】手工焊接Micro USB接口器件型号选择
  15. 人工智能(AI)是如何处理数据的?
  16. 关于“车联网”的最强科普!
  17. 运用java爬虫和python做词云图
  18. 2022年R2移动式压力容器充装操作证考试题库及模拟考试
  19. E4A易安卓计次循环和变量循环及数组
  20. 公司招个程序员,34岁以上两年一跳的不要,开出工资以为看错了

热门文章

  1. 知识图谱商业应用 、介绍
  2. 在win10下安装Linux双系统
  3. Unity3D新手入门初级教程
  4. c语言经典50道例题---精华篇
  5. 深入解析Windows操作系统(笔记2)
  6. C语言程序设计学习总结
  7. 安装matlab7.0步骤,Matlab 7.0 安装指导
  8. codejock toolkit pro 19.2 for MFC
  9. 用JCreator编写java程序
  10. [系统修复]Win XP中Winsock2系统文件破坏导致无法上网