Spring---Spring IOC与DI

亦凉 2022-10-27 02:27 266阅读 0赞

什么是IOC?

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。—-百度百科

什么是DI?

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

举例:

举一个现实中的例子,我们要设计汽车:先设计轮子,根据轮子大小设计底盘,然后根据底盘设计车身,最后根据车身设计完成整个汽车。这时候设计汽车的各个步骤间就存在着强依赖关系:汽车依赖车身,车身依赖底盘,底盘依赖轮子。

对应代码:

  1. //轮胎类
  2. public class Tire {
  3. private int size;
  4. public Tire(){
  5. this.size=50;
  6. System.out.println("轮胎尺寸为"+size);
  7. }
  8. }
  9. //底盘类
  10. public class Chassis{
  11. private Tire tire;
  12. public Chassis(){
  13. this.tire=new Tire();
  14. }
  15. }
  16. //车身类
  17. public class Bodywork {
  18. private Chassis chassis;
  19. public Bodywork (){
  20. this.chassis=new Chassis ();
  21. }
  22. }
  23. //测试类
  24. public class Test {
  25. public static void main(String[] args) {
  26. Car mycar=new Car();
  27. mycar.run();
  28. }
  29. }

执行结果:

20210203192201149.png

现在看似没有任何的问题,但是市场需求变了,要把车轮改大,这样能提高速度。

对应代码:

  1. //轮胎类
  2. public class Tire {
  3. private int size;
  4. public Tire(int size){
  5. this.size=size;
  6. System.out.println("轮胎尺寸为"+size);
  7. }
  8. }
  9. //底盘类
  10. public class Chassis{
  11. private Tire tire;
  12. public Chassis(int size){
  13. this.tire=new Tire(size);
  14. }
  15. }
  16. //车身类
  17. public class Bodywork {
  18. private Chassis chassis;
  19. public Bodywork (int size){
  20. this.chassis=new Chassis (size);
  21. }
  22. }
  23. //测试类
  24. public class Test {
  25. public static void main(String[] args) {
  26. int size=50;
  27. Car mycar=new Car();
  28. mycar.run();
  29. }
  30. }

执行结果:

20210203192211622.png

之前我们是根据轮子大小设计的底盘,此时轮子大小变化,底盘的大小也必须修改,同样的道理,车身也要进行修改,整体看来,整个设计全部都要修改。很显然,严重违反了开放封闭的设计原则,在实际的项目中,一个类的依赖项可能会有很多,如果要修改,我们可能需要修改成千上万的类,代码维护成本太高,这是不可取的。

如何解决这个问题呢?此时, 我们需要进行控制反转(Inversion of Control),通过依赖注入(Dependency Injection)的方式实现。

  1. //轮胎类
  2. public class Tire {
  3. private int size;
  4. Tire(int size){
  5. this.size=size;
  6. }
  7. }
  8. //底盘类
  9. public class Chassis{
  10. private Tire tire;
  11. Chassis(Tire tire){
  12. this.tire=tire;
  13. }
  14. }
  15. //车身类
  16. public class Bodywork{
  17. private Chassis chassis;
  18. Bodywork(Chassis chassis){
  19. this.chassis=chassis;
  20. }
  21. }
  22. //测试类
  23. public class Test {
  24. public static void main(String[] args) {
  25. mycar.run();
  26. int size=50;
  27. Tire tire=new Tire(size);
  28. Chassis chassis=new Chassis(tire);
  29. Bodywork bodywork=new Bodywork(chassis);
  30. Car mycar=new Car(bodywork);
  31. mycar.run();
  32. }
  33. }

执行结果:

20210203192211622.png

刚刚上面已经公布了答案,我们是通过依赖注入的方式来实现的控制反转。其实就是把底层类作为参数传入上层,从而实现了上层类对下层类的“控制”,让原本上层依赖下层转换为下层依赖上层。

发表评论

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

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

相关阅读

    相关 了不起的 IoC DI

    本文阿宝哥将从六个方面入手,全方位带你一起探索面向对象编程中 IoC(控制反转)和 DI(依赖注入) 的设计思想。阅读完本文,你将了解以下内容: IoC 是什么、IoC

    相关 Spring---Spring IOCDI

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

    相关 【Spring学习】IoCDI

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

    相关 spring的IoCDI

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

    相关 Spring -- IoC DI

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

    相关 IoCDI

    IoC 和 DI IoC (Inverse of Control ,控制反转) ,单看名字的话,并不知道这个概念是指什么。 因为 IoC 确实不够开门见山,因此业界曾进