多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# Spring IOC > 原文: [https://javatutorial.net/ioc-in-spring](https://javatutorial.net/ioc-in-spring) 解释控制反转(IOC)概念的一个著名示例是霍利伍德(Holywood)原则,该原则规定“不要打电话给我们,我们会打电话给您”。 毫无疑问,这是一个非常准确的类比,因此有很多人将其称为类比。 ![spring-featured-image](https://img.kancloud.cn/64/23/64231db4bf6e880066d0d4c2e31ac166_780x330.jpg) 通常,类创建依赖关系。 但是,IOC 为我们提供了相反的功能–只要类需要这些依赖关系,它们就可以在运行时提供给类。 您现在知道为什么霍利伍德类比如此准确吗? 课堂上没有说“不要打电话给我们,我们会打电话给您”,而是依赖项说的。 为什么这么重要? 好吧,这很重要,因为这些类可以仅专注于提供功能,而不是在正确的时间调用正确的依赖项。 ## IOC 到底是什么? 除了上面已经解释的内容外,还可以将控制反转(IOC)视为通常的总体工作流程的反转器,例如 高级对象处理依赖关系的方式。 反转控制(IOC)的另一个著名名称是依赖注入(DI),这意味着依赖已被正确注入,并且对象/类在对象创建中不会受到青睐,而是专注于执行正确的功能。 ## 不使用 IOC 的顶级概述代码实现 ```java public class WithoutIOCDemo { static class Creature { public void determineRaceAndSpawn(String _race) { if (_race.equals("Human")) { Human hum = new Human(); human.spawn(); } else if (_race.equals("Sark")) { Sark sark = new Sark(); sark.spawn(); } else if (_race.equals("Mavvek")) { Mavvek mav = new Mavvek(); mav.spawn(); } else { System.out.println("No such race spported. The only options are: Human, Sark and Mavvek."); } } } public static void main(String [] args) { WithoutIOCDemo noIOC = new WithoutIOCDemo(); noIOC.determineRaceAndSpawn("Human"); // would work } } ``` 从该简单示例中可以看到,`defineRace`方法依赖于诸如`Human`,`Sark`和`Mavvek`之类的较低级对象。 **请注意**:方法`spawn()`刚刚组成,我们可以假装它存在并且按照它说的去做。 现在,让我们看一下如何通过使用 IOC 并使得`defineRace`方法不依赖于较低级别的对象来获得与上述示例相同的结果。 ## 使用 IOC 的顶层概述代码实现 ```java public class WithIOCDemo { Creature creature; public WithIOCDemo(Creature creature) { this.creature = creature; } public void determineRaceAndSpawn() { this.creature.spawn(); } public static void main(String [] args) { Creature humanCreature = new Human(); WithIOCDemo noIOC = new WithIOCDemo(humanCreature); noIOC.determineRaceAndSpawn(); // would work } } ``` 乍一看,这种方法为我们节省了很多代码行,而且确实如此。 但是更详细一点,这也使我们的`determineRaceAndSpawn()`方法不依赖于可用的`Creature`种族(人类,Sark 和 Mavvek(请参考上面的示例))。 “不依赖”是指与没有 IOC 实现的示例不同,我们的方法不需要在方法中实例化相应的**生物**。 现在所有方法所做的就是生成生物。 简而言之,我们消除了实例化以及生成生物的负担。 现在,它只会生成它。 因此,如果将函数从`determineRaceAndSpawn()`重命名为:`spawnCreature()`,这将是有意义的。