Spring IoC容器、IoC与DI

港控/mmm° 2024-03-23 15:30 218阅读 0赞

目录

Spring是什么?

理解容器

什么是IoC(Inversion of Control)

传统的new创建对象的方式中类与类的耦合程度很大。

IoC的优势:

Spring IoC容器最核心的功能

什么是DI (Dependency Injection)

IoC和DI的区别


Spring是什么?

Spring是指Spring Framework(Spring框架),它是开源的框架,有着很庞大的社区,通过使用Spring可以使我们的开发变的更简单。一句话概括的话:Spring是包含众多工具方法的IoC容器。

理解容器

容器就是用来容纳某种物品的基本装置。

像我们之前学过的List,Map等等都是用来容纳元素的容器,像Tomcat就是用来存放Web应用程序的容器。

什么是IoC(Inversion of Control)

翻译过来就是控制权反转

在谈到IoC的时候,我们总是会和传统的new创建对象的方式进行比较。

我们知道:

传统的new创建对象的方式中类与类的耦合程度很大。

例如:我们要创建一个汽车模型,按照传统的方式我们是这样实现的:

df3b583839674c1d9d62556165135a2f.png

正常流程我们会在每一层下面去new下一层的对象

  1. public class Car {
  2. public static void main(String[] args) {
  3. Car car=new Car();
  4. car.Init();
  5. }
  6. //框架
  7. static class Frame{
  8. //车架初始化
  9. public void FrameInit(){
  10. //在车架中new 车轮
  11. Tire tire=new Tire();
  12. //调用初始化方法
  13. tire.TireInit();
  14. System.out.println("车架已完成初始化");
  15. }
  16. }
  17. //车轮
  18. static class Tire{
  19. //车轮初始化
  20. public void TireInit(){
  21. System.out.println("车轮已完成初始化");
  22. }
  23. }
  24. //Car初始化
  25. private void Init(){
  26. //new 下一层对象
  27. Frame frame=new Frame();
  28. //调用下一层对象的初始化方法
  29. frame.FrameInit();//这一层方法中会new下一层的对象并调用初始化方法
  30. System.out.println("车辆已完成初始化>> 车辆制作完成!");
  31. }
  32. }

这个时候如果我们有了新的需求就会牵一发而动全身。耦合性太高了。比如我们要实现轮胎的尺寸定制。就需要每个类中都进行修改:

  1. public class Car {
  2. public static void main(String[] args) {
  3. Car car=new Car();
  4. car.Init(50);
  5. }
  6. //框架
  7. static class Frame{
  8. //车架初始化
  9. public void FrameInit(int size){
  10. //在车架中new 车轮
  11. Tire tire=new Tire();
  12. //调用初始化方法
  13. tire.TireInit(size);
  14. System.out.println("车架已完成初始化");
  15. }
  16. }
  17. //车轮
  18. static class Tire{
  19. //车轮初始化
  20. public void TireInit(int size){
  21. System.out.println("车轮已完成初始化");
  22. System.out.println("轮胎的尺寸为:"+ size);
  23. }
  24. }
  25. //Car初始化
  26. private void Init(int size){
  27. //new 下一层对象
  28. Frame frame=new Frame();
  29. //调用下一层对象的初始化方法
  30. frame.FrameInit(size);//这一层方法中会new下一层的对象并调用初始化方法
  31. System.out.println("车辆已完成初始化>> 车辆制作完成!");
  32. }
  33. }

所以我们可以直接在每一层提供属性引用,直接指向下一层:

  1. public class Car {
  2. //车架
  3. private Frame frame;
  4. //在构造方法中获得该车架
  5. public Car(Frame frame){
  6. this.frame=frame;
  7. }
  8. //在车的初始化方法中执行车架的初始化方法
  9. public void init(){
  10. frame.init();
  11. }
  12. //车架类
  13. static class Frame{
  14. //轮胎
  15. private Tire tire;
  16. //构造方法中获得该轮胎
  17. public Frame(Tire tire){
  18. this.tire=tire;
  19. }
  20. //在车架的初始化方法中调用轮胎的初始化方法
  21. public void init(){
  22. tire.init();
  23. }
  24. }
  25. //轮胎类
  26. static class Tire{
  27. //设置轮胎的属性
  28. private int size;
  29. //轮胎的尺寸
  30. public Tire(int size){
  31. this.size=size;
  32. }
  33. //轮胎的初始化方法
  34. public void init() {
  35. System.out.println("轮胎的大小是:"+this.size);
  36. }
  37. }
  38. public static void main(String[] args) {
  39. //创建轮胎类,制定轮胎大小
  40. Tire tire=new Tire(20);
  41. //创建车架类,轮胎作为属性传递进去
  42. Frame frame=new Frame(tire);
  43. //创建一个Car类,frame作为属性传递下去
  44. Car car=new Car(frame);
  45. }
  46. }

这时候,如果我们还需要修改Tire,只需要改动两个地方:一个是Tire类属性,一个是main方法中的参数,然后中间的调用过程就不用修改了,这时候耦合性就降低下来了。

这个时候我们再说说IoC:

IoC的优势:

实现代码解耦,同时把对象(Bean)交给了IoC进行维护,与传统的方式相比,IoC不再是上级对象创建控制下一层对象了,而是把下一层的对象注入到上一级对象当中,所以IoC就是把控制对象生命周期的权利交给了IoC容器。

传统方式与IoC方式的对比:

856e30c18abc4a448b32e5f993787b12.png

Spring IoC容器最核心的功能

管理对象(Bean)在Spring中的存取。

什么是DI (Dependency Injection)

翻译过来就是依赖注入 ,指的就是把对象(Bean)注入到IoC容器当中,如果外面想要获取该对象,就需要从容器中取

IoC和DI的区别

IoC是一种重要的思想,是Spring的核心思想之一。这种思想就是控制权反转,把对象(Bean)的生命周期交给IoC容器,而DI则是IoC思想的具体实现 。比如我今天的心情比较好,我想出去玩。我想出去玩就是IoC,就是思想和目标,而我想出去玩我可以去动物园玩,也可以去游乐场玩,这就是DI,也就是具体的实现。

发表评论

表情:
评论列表 (有 0 条评论,218人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Spring---Spring IOCDI

    什么是IOC? 控制反转(Inversion of Control,缩写为IoC),是[面向对象编程][Link 1]中的一种设计原则,可以用来减低计算机代码之间的[耦合度]

    相关 Spring学习】IoCDI

           看了两篇讲IoC和DI的文章,实在是讲得太好,有种不知道再怎么写的感觉,终于明白李白为啥说黄鹤楼景色虽好,却因崔颢的题诗在前,无法写诗是啥意思了。两篇文章见下:

    相关 springIoCDI

    IOC(DI):其实这个Spring[架构][Link 1]核心的概念没有这么复杂,更不像有些书上描述的那样晦涩。[Java][]程序员都知道:java程序中的每个业务逻辑至少

    相关 Spring -- IoC DI

    控制反转(IoC, Inversion of Control),是一个概念,是一种思想。指将传统上由程序代码直接操控的对象调用权交给容器,通过容器来实现对象的装配和管理。控制反