Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >spring的ioc实现原理_ioc控制反转和di依赖注入

spring的ioc实现原理_ioc控制反转和di依赖注入

作者头像
Java架构师必看
发布于 2022-07-06 07:33:25
发布于 2022-07-06 07:33:25
47800
代码可运行
举报
文章被收录于专栏:Java架构师必看Java架构师必看
运行总次数:0
代码可运行

大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说spring的ioc实现原理_ioc控制反转和di依赖注入,希望能够帮助大家进步!!!

一.IoC的基础知识以及原理:

1.IoC理论的背景:在采用面向对象方法设计的软件系统中,底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。即软件系统中对象之间的耦合,对象A和对象B之间有关联,对象B又和对象C有依赖关系,这样对象和对象之间有着复杂的依赖关系,所以才有了控制反转这个理论。

2.什么是控制反转(IoC):

(1).IoC是Inversion of Control的缩写,有的翻译成“控制反转”,还有翻译成为“控制反向”或者“控制倒置”。

(2).1996年,Michael Mattson在一篇有关探讨面向对象框架的文章中,首先提出了IoC 这个概念。简单来说就是把复杂系统分解成相互合作的对象,这些对象类通过封装以后,内部实现对外部是透明的,从而降低了解决问题的复杂度,而且可以灵活地被重用和扩展。IoC理论提出的观点大体是这样的:借助于“第三方”实现具有依赖关系的对象之间的解耦,如下图所示:

即把各个对象类封装之后,通过IoC容器来关联这些对象类。这样对象与对象之间就通过IoC容器进行联系,但对象与对象之间并没有什么直接联系。

如果去掉IoC容器后系统中的对象A与对象B就有了直接关系,如下图所示:

比如好多的对象类要关联起来的话,就会变得很复杂,如下图所示:

所以提出IoC控制反转是很有必要的。

(3).为什么要把这种方式叫做控制反转呢?

— 软件系统在没有引入IoC容器之前,对象A依赖对象B,那么A对象在实例化或者运行到某一点的时候,自己必须主动创建对象B或者使用已经创建好的对象B,其中不管是创建还是使用已创建的对象B,控制权都在我们自己手上。

— 如果软件系统引入了Ioc容器之后,对象A和对象B之间失去了直接联系,所以,当对象A实例化和运行时,如果需要对象B的话,IoC容器会主动创建一个对象B注入到对象A所需要的地方。

— 通过前面的对比,可以看到对象A获得依赖对象B的过程,由主动行为变成了被动行为,即把创建对象交给了IoC容器处理,控制权颠倒过来了,这就是控制反转的由来!

3.IoC的别名:依赖注入(DI)

(1).2004年,Martin Fowler探讨了同一个问题,既然IoC是控制反转,那么到底是“哪些方面的控制被反转了呢?”,经过详细地分析和论证后,他得出了答案:“获得依赖对象的过程被反转了”。控制被反转之后,获得依赖对象的过程由自身管理对象变为由IoC容器主动注入。于是,他给“控制反转”取了一个更合适的名字叫做“依赖注入(Dependency Injection,DI)”。他的这个答案,实际上给出了实现IoC的方法:注入。

(2).所谓依赖注入,就是由IoC容器在运行期间,动态地将某种依赖关系注入到对象之中。

(3).所以,依赖注入(DI)和控制反转(IoC)是从不同的角度描述的同一件事情,就是指通过引入IoC容器,利用依赖关系注入的方式,实现对象之间的解耦。

4.使用IoC的好处:

(1).可维护性比较好,非常便于进行单元测试,便于调试程序和诊断故障。代码中的每一个Class都可以单独测试,彼此之间互不影响,只要保证自身的功能无误即可,这就是组件之间低耦合或者无耦合带来的好处。

(2).每个开发团队的成员都只需要关注自己要实现的业务逻辑,完全不用去关心其他人的工作进展,因为你的任务跟别人没有任何关系,你的任务可以单独测试,你的任务也不用依赖于别人的组件,再也不用扯不清责任了。所以,在一个大中型项目中,团队成员分工明确、责任明晰,很容易将一个大的任务划分为细小的任务,开发效率和产品质量必将得到大幅度的提高。

(3).可复用性好,我们可以把具有普遍性的常用组件独立出来,反复应用到项目中的其它部分,或者是其它项目,当然这也是面向对象的基本特征。显然,IoC更好地贯彻了这个原则,提高了模块的可复用性。符合接口标准的实现,都可以插接到支持此标准的模块中。

(4).IoC生成对象的方式转为外置方式,也就是把对象生成放在配置文件里进行定义,这样,当我们更换一个实现子类将会变得很简单,只要修改配置文件就可以了,完全具有热插拨的特性。

5.IoC的原理:控制反转是Spring框架的核心。其原理是基于面向对象(OO)设计原则的The Hollywood Principle:Don't call us, we'll call you(别找我,我会来找你的)。也就是说,所有的组件都是被动的,所有的组件初始化和调用都由容器负责。组件处在一个容器当中,由容器负责管理。简单的来讲,就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控,即在一个类中调用另外一个类。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,即所谓反转。

6.工厂模式:

(1).在Spring IoC中经常用到一个设计模式,即工厂模式。工厂模式提供创建对象的接口。

(2).工厂模式是指当应用程序中甲组件需要乙组件协助时,并不是在甲组件中直接实例化乙组件对象,而是通过乙组件的工厂获取,即该工厂可以生成某一类型组件的实例对象。在这种模式下,甲组件无需与乙组件以硬编码的方式耦合在一起,而只需与乙组件的工厂耦合。

(3)接下来附上一个工厂模式的例子:

首先,新建一个Java项目FactoryTest,然后新建一个接口Animal,放在com.inter包下:

Animal.java文件代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.inter;

public interface Animal {
	void eat();//定义抽象的吃方法
	void shout();//定义抽象的叫方法
}

只听到从架构师办公室传来架构君的声音:

古来共如此,非君独抚膺。有谁来对上联或下联?

然后分别新建两个JavaBean,即Dog类和Cat类,放在com.bean包下,并都实现了Animal这个接口:

Dog.java文件代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
此代码由Java架构师必看网-架构君整理
package com.bean;

import com.inter.Animal;

public class Dog implements Animal{

	@Override
	public void eat() {
		// TODO Auto-generated method stub
		System.out.println("狗吃狗粮");
	}

	@Override
	public void shout() {
		// TODO Auto-generated method stub
		System.out.println("狗汪汪叫");
	}

}

Cat.java文件代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.bean;

import com.inter.Animal;

public class Cat implements Animal{

	@Override
	public void eat() {
		// TODO Auto-generated method stub
		System.out.println("猫吃猫粮");
	}

	@Override
	public void shout() {
		// TODO Auto-generated method stub
		System.out.println("猫喵喵叫");
	}

}

接着新建一个工厂类Factory,放在com.factory,使得Dog类和Cat类在工厂类上关联起来,Dog类和Cat类并不直接关联:

Factory.java文件代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
此代码由Java架构师必看网-架构君整理
package com.factory;

import com.bean.Cat;
import com.bean.Dog;
import com.inter.Animal;

public class Factory {
	public Animal getAnimal(String name){
		if(name.equals("dog")){
			return new Dog();
		}else if(name.equals("cat")){
			return new Cat();
		}else{
			throw new IllegalArgumentException("参数不正确!");
		}
	}
}

最后,写一个Test测试类,放在com.test包下,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.test;

import com.factory.Factory;
import com.inter.Animal;

public class Test {
	public static void main(String[] args){
		Animal a=null;
		a=(Animal) new Factory().getAnimal("dog");
		a.eat();
		a.shout();
		a=(Animal)new Factory().getAnimal("cat");
		a.eat();
		a.shout();
	}
}

运行后,效果如下:

二.这里先介绍IoC的基础知识和原理,IoC的主要组件和注入的两种方式,我会另外写一篇文章,以免太多大家难理解,大家先好好理解IoC的原理吧!

IoC的主要组件和注入的两种方式这篇文章已写好:

http://blog.csdn.net/u012561176/article/details/46006385

以上就是全部内容,写得不好,请见谅,如有错误,请指出,谢谢!

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring之IoC(控制反转)与DI(依赖注入)
本博客将深入探讨控制反转(IoC)和依赖注入(DI)的概念与原理。我们将讨论如何通过XML和注解配置IoC容器,解释Bean的生命周期和作用域,并提供代码示例和注释。此外,还将强调注意事项,并在最后总结所讨论的内容。
默 语
2024/11/20
1570
Spring框架入门(三):依赖注入和控制反转
依赖注入(IoC) 和 控制反转(DI) 有什么关系呢?其实它们是同一个概念的不同角度描述。
sr
2019/05/23
5490
介绍依赖注入,依赖查找,控制反转--php实例
不是我自身的,却是我需要的,都是我所依赖的。一切需要外部提供的,都是需要进行依赖注入的。
OwenZhang
2022/01/05
5090
介绍依赖注入,依赖查找,控制反转--php实例
到底什么是控制反转(IOC)和依赖注入(DI)
在编程中,当我们用到一个对象时,首先需要主动创建它,但是在大型项目中,大家分工合作,也许我们要用到的对象对应的类还没有被编写出来,我们肯定没法办new出来,这个时候就有了Spring框架,对象交给Spring来创建(我们不关心也没有能力关心是否已经有了对应的类和Spring是否能够创建我们需要的对象),我们直接从Spring容器中获取对象使用即可,此前对象是由我们主动创建的,我们具有控制权,但使用Spring框架之后我们将创建对象的权力交给了Spring,也就意味着我们对对象的控制权反转给了Spring,这就是控制反转;
訾博ZiBo
2025/01/06
530
.net 温故知新:【7】IOC控制反转,DI依赖注入
大部分应用程序都是这样编写的:编译时依赖关系顺着运行时执行的方向流动,从而生成一个直接依赖项关系图。 也就是说,如果类 A 调用类 B 的方法,类 B 调用 C 类的方法,则在编译时,类 A 将取决于类 B,而 B 类又取决于类 C
SpringSun
2022/09/23
5200
.net 温故知新:【7】IOC控制反转,DI依赖注入
IOC控制反转与DI依赖注入
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
全栈程序员站长
2022/08/31
2000
IOC控制反转与DI依赖注入
我看依赖注入
new代码味道——狎昵(xia ni)关系:过分亲近 这个主题是我比较想重点聊聊的,因为我个人的理解是依赖注入思想最终想解决的问题就是消除对象之间的耦合,再通俗一点讲就是消除new代码味道,解决的指导思想是将组件的配置和使用分离。 什么是代码味道? 如果某段代码可能存在问题,就可以说有代码味道。这里使用“可能”是因为少量的代码味道并不一定就是问题。 代码味道还可能表明有技术债务存在,而技术债务的修复是有代价的。背负技术债务越久,债务修复就会越难。 代码味道有许多分类。 思考一下为什么除了一些特殊情况外
撸码那些事
2018/06/21
8960
Spring系列第2篇:控制反转(IoC)与依赖注入(DI),晦涩难懂么?
Spring中有3个核心的概念:控制反转(Ioc)、依赖注入(DI)、面向切面编程(AOP),spring中其他的技术都是依靠3个核心的技术建立起来的,所以玩spring需要先对这3个概念有个深入的理解。
路人甲Java
2020/02/18
6350
依赖注入和控制反转是什么?
年前,@绵阳飞在群里发起了一个讨论,依赖注入和控制反转到底是什么? 我之前对依赖注入和控制反转也不甚理解,直至在学习Phalcon框架的过程中,发现在Phalcon文档中有一个篇幅通过代码示例的方式专门描述了依赖注入的原理。本文打算通过此文档中的代码示例来讲解什么是依赖注入(DI)和控制反转(IoC)。通过示例代码,来更加深入的了解这些概念。 接下来的例子有些长,但解释了为什么我们要使用依赖注入。所以绝对都是干货,请耐心读完,必会有所收获。 依赖的产生 首先,假设我们正在开发一个组件,叫SomeComp
Marser
2018/06/25
1.9K0
依赖注入原理---IoC框架
1 IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。 图1:软件系统中耦合的对象
三哥
2018/06/15
1.9K0
依赖注入和控制反转
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) 、DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC 、DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及谈谈我对Spring Ioc的理解。
AlbertZhang
2020/11/05
8870
【Spring教程】依赖注入(DI)和控制反转(IoC)
  不管是依赖注入,还是控制反转,其含义完全相同:当某个Java实例(调用者)需要另一个Java实例(被调用者)时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。   在依赖注入的模式下,创建被调用者的工作不再由调用者来完成,因此成为控制反转;创建被调用者实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。   不管是依赖注入,还是控制反转,都说明了Spring采用动态、灵活的方式来管理各种对象。对象与对象之间的具体实现互相透明。
程序员云帆哥
2022/05/12
2710
【Spring教程】依赖注入(DI)和控制反转(IoC)
Spring系列三:IoC 与 DI
在软件工程中,控制反转(IoC)是一种设计思想,对象之间耦合在一起,在运行时自动绑定,并且它们编译时对所需要引用的对象是不确定的。在这个spring教程中,通过示例了解ioc和spring中的依赖注入之间的区别。
java干货
2021/02/19
6380
Spring系列三:IoC 与 DI
深入理解 Spring IoC 和 DI:掌握控制反转和依赖注入的精髓
控制反转是软件工程中的一个原则,它将对象或程序的某些部分的控制权转移给容器或框架。我们最常在面向对象编程的上下文中使用它。
小万哥
2023/08/11
5910
深入理解 Spring IoC 和 DI:掌握控制反转和依赖注入的精髓
Spring控制反转与依赖注入
学习Spring框架,它的核心就是IoC容器。要掌握Spring框架,就必须要理解控制反转的思想以及依赖注入的实现方式。下面,我们将围绕下面几个问题来探讨控制反转与依赖注入的关系以及在Spring中如何应用。
用户3467126
2019/08/12
6480
Spring学习笔记 | 控制反转IoC与依赖注入DI
IoC 是Spring框架最核心的特性之一。在IoC模式下,对象(组件)的创建和管理不再由对象自己负责,而是交给了IoC容器。对象只需要声明自己的依赖,IoC容器会在运行时自动将依赖注入到对象中。
windealli
2024/04/30
3800
Spring学习笔记 | 控制反转IoC与依赖注入DI
第一章 Spring 的控制反转/依赖注入
spring:春天 IOC:将创建对象的权力交给 spring 核心容器去控制。工厂模式
用户9184480
2024/12/07
750
使用 IOC 控制反转和 DI 依赖注入的意义
其实我的标题没写对,这个话题我是聊不下去的。 本文只和小伙伴聊聊为什么使用容器注入,优缺点是什么。我通过问问题的方式让小伙伴了解这么做的意义
林德熙
2020/07/28
9210
使用 IOC 控制反转和 DI 依赖注入的意义
IOC控制反转 + DI依赖注入
Spring中的IOC一种思想,两种实现方式IOC (Inversion of Control):控制反转,是一种概念和思想,指由Spring容器完成对象创建和依赖注入核心业务:(a)对象的创建 (b)依赖的注入2种实现方式基于xml实现IOC基于注解实现IOC基于xml的IOC在前3篇Spring博客中简单探讨过了,后面将探讨基于注解的IOC基于注解的IOCDI (Dependency Injection):基于注解的IOC被称为DI,即依赖注入, 是IOC思想的一种具体实现方式根据IOC的核心业务即:(
愿天堂没有BUG
2022/09/28
2920
轻松理解.NET控制反转和依赖注入
在软件工程领域,特别是在 C# 和 .NET 的上下文中,控制反转(Inversion of Control,IoC)和依赖注入(Dependency Injection,DI)是增强代码模块化、可测试性和可维护性的基本原则。这些范式允许开发人员通过将依赖关系的创建和管理与业务逻辑分离,构建松耦合、灵活的应用程序。
郑子铭
2024/07/12
2650
轻松理解.NET控制反转和依赖注入
推荐阅读
相关推荐
Spring之IoC(控制反转)与DI(依赖注入)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验