IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 对Spring控制反转和依赖注入的理解----生动形象(IOC、DI) -> 正文阅读

[Java知识库]对Spring控制反转和依赖注入的理解----生动形象(IOC、DI)

1. IOC 控制反转

IOC : inversion of control 控制反转 ----实例化的一个过程
实例化的主动权交给Spring ,以配置的形式来进行,将实例化的对象放入Spring容器中。即,
通过Spring容器管理Java类的对象,而不是在Java类中new一个对象。

好莱坞法则:“别找我们,我们找你”
为什么叫控制反转?顾名思义,将寻找(实例化)对象的控制权转交给容器,而不是自己控制这个对象。

没理解?别着急!往下看。
提前告诉你:
别找我们 ,别傻乎乎地在自己的类里面引入另一个类,耦合度高,牵一发动全身~
我们找你,你都不找我了,怎么用我们啊,只能我们自己上门了。这个上门可不是在你那打地基盖房子,而是我们携家带口揣着户口本房产证上门,就是说,该有的我们都有,我们是对象,不用new, 给你注入你用就行。

2. DI 依赖注入

DI:Dependency Injection
目的:保持松散耦合

2.1 常规方式

骑士为了展现自己的冒险精神,自己new 了一个Quest对象,然后对此对象进行操作。骑士打败了坏蛋Bully,他觉得自己升级了,“老子天下第一”,我要去杀死恶龙。然而骑士发现,我TM去哪找恶龙啊?好,我千辛万苦在苦逼程序员手动引入的前提下找到了恶龙类,new 一个外部的恶龙类才能杀龙,好麻烦啊。

初级骑士

// 骑士类
public class Knight {
	private Quest quest;
	public Knight() {
		this.quest = new Quest();
	}
	
	public void embark() {
		System.out.println("骑士将要做的事:");
		quest.killBully();
		
	}
}

冒险类1—坏蛋类

//冒险类1---坏蛋类
public class Quest1 {
	public String killBully() { //打败坏蛋
		return "kill Bully";
	}
}

升级后的骑士

好,作为骑士我现在可以屠龙了。感谢帮我引入恶龙类的新时代码农!码农啊,你是否产生了这样一个疑问:直接在Quest1—坏蛋类里加一个方法,让坏蛋骑着恶龙,我作为骑士,再引入一个屠龙的方法就行啊。码农再想,不对啊,这不就破坏了Java的封装性了吗?两个实体类合成一个,你是想直接打BOSS吗,不行!万一世界上还有什么青龙、白龙呢?

// 骑士类
public class Knight {
	private Quest1 quest1;
	private Quest2 quest2;
	public Knight() {
		this.quest1 = new Quest1();
		this.quest2 = new Quest2();
	}
	
	public void embark() {
		System.out.println("骑士将要做的事:");
		quest1.killBully();
		quest2.killDragon();
	}
}

冒险类2----恶龙类

//冒险类2
public class Quest2 {
	public String killDragon() { //屠龙
		return "kill dragon";
	}
}

2.2 头秃的骑士

骑士觉得老是靠程序员帮自己做事,面子挂不住。于是,有一天,骑士找了一个中介,也就是Spring容器,中介可以通过XML配置的形式,向骑士注入一系列信息。这下码农着急了,你这不开挂吗?码农想学习到这种技术,然后把骑士的生意抢回来!
那我就教你 “注入” !!
先给你灌输一个词汇:接口

升级后的探险

public interface QuestPro {
	public void embark();
}

坏蛋被探险

public class BullyImpl implements QuestPro {

	@Override
	public void embark() {
		System.out.println("kill bully");
	}

}

恶龙被探险

public class DragonImpl implements QuestPro {

	@Override
	public void embark() {
		System.out.println("kill dragon");
	}

}

最强骑士

public class KnightPro {
	private QuestPro questPro;
	public KnightPro(QuestPro questPro) {//QuestPro被注入进来
		this.questPro = questPro;
	}
	
	public void quest() {
		questPro.embark();
	}
}

骑士说!

加了接口就是注入了吗?并不是!码农啊,你想一想,是不是QuestPro被注入骑士类了,那谁来实例化这个QuestPro呢?
答案就是中介!通过XML配置给骑士注入一个对象,而不需要骑士自己去new。
骑士:确实不能自己new, 即使是实现了接口,那我自己new的时候,还需要new 两个对象!

QuestPro q1 = new BullyImpl();
QuestPro q2 = new DragonImpl();

这和不用接口什么区别!还是得靠中介注入啊。直接注入对象,你注入啥我就用啥,来者不拒。

public KnightPro(QuestPro questPro) {//QuestPro被注入进来
		this.questPro = questPro;
	}

3. 总结

码农明白了!如果骑士还想继续升级,无论是怪兽还是奥特曼,只要实现了QuestPro接口;中介注入给骑士一个对象,那骑士就可以出手了,而且自己内部还不用变动。
扛着长枪短炮的去冒险太麻烦了,轻装上阵才最强!

程序的整个思想是控制反转,具体实现采用依赖注入!
专业术语表示:
控制反转:实例化的主动权交给Spring ,以配置的形式来进行,将实例化的对象放入Spring容器中。
依赖注入:
什么是依赖?冒险类依赖于骑士类,没有骑士哪来的冒险!
什么是注入?就是不用自己实例化对象,用到的对象都是外界传入的。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-28 08:53:50  更:2021-08-28 08:55:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:30:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码