Spring的IOC&DI

Posted 爱敲代码的三毛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring的IOC&DI相关的知识,希望对你有一定的参考价值。

文章目录


Spring

Spring是什么?

我们通常所说的Spring指的是 Spring Framework(Spring框架),它是一个开源框架。

用一句话概括:Sping是包含了众多工具方法IoC容器

什么是IoC

Sping是一个IoC容器

什么是IoC?IoC = Inversion of Control,翻译成中文就是控制反转的意思。

也就是说Spring是一个控制反转的容器

传统程序开发

举个列子

列如,我们我们现在构建一辆车。

构造的顺序是:汽车->车身->底盘->轮胎

public class CarDemo 
    public static void main(String[] args) 
        Car car = new Car();
        car.run();
    

    /**
     * 汽车类
     */
    static class Car 
        public void run() 
            Framework frame = new Framework();
            frame.init();
        
    
    /**
     * 车身
     */
    static class Framework 
        public void init() 
            Chassis chassis = new Chassis();
            chassis.init();
        
    
    /**
     * 底盘
     */
    static class Chassis 
        public void init() 
            Tire tire = new Tire();
            tire.init();
        
    
    /**
     * 轮胎类
     */
    static class Tire 
        private int size = 20;
        public void init() 
            System.out.println("车轮大小为"+size);
        
    

传统程序开发的缺陷

以上程序开发车轮的大小时固定的,车身颜色也不能设置。随着客户的需求越来越多。所以就要设置多种车轮和车身颜色

  • 当我们我们修改了轮胎类底盘类就受到了影响
  • 我们就得修改底盘类,修改底盘类后又发现车身类受到了影响
  • 我们又得继续修改车身类,修改完车身类后又有了新的问题
  • 汽车类受到影响,又得做修改
public class NewCarDemo 
    public static void main(String[] args) 
        Car car = new Car();
        car.run(20);
    

    /**
     * 汽车类
     */
    static class Car 
        public void run(int size) 
            //依赖车身
            Framework frame = new Framework();
            frame.init(size);
        
    
    /**
     * 车身
     */
    static class Framework 
        public void init(int size) 
            //依赖底盘
            Chassis chassis = new Chassis();
            chassis.init(size);
        
    
    /**
     * 底盘
     */
    static class Chassis 
        public void init(int size) 
            //依赖轮胎
            Tire tire = new Tire();
            tire.init(size);
        
    
    /**
     * 轮胎类
     */
    static class Tire 
        public void init(int size) 
            System.out.println("车轮大小为"+size);
        
    

从上面代码可以看出,当最底层代码改动后,整个调用链的代码都需要改动

当车轮发生发生改变时,就需要改底盘类

而底盘代码发生改变时,又需要改车身类

那如果车身又加了个颜色属性呢?,车身类一改汽车类又要改

传统开发的这种现象叫做代码的耦合问题

那么就可以使用IoC实现解耦合

控制反转式程序开发

public class IoCNewCarDemo 
    public static void main(String[] args) 
        //构造轮胎
        Tire tire = new Tire(30);
        //给底盘提供轮胎
        Chassis chassis = new Chassis(tire);
        //给车身提供底盘
        Framework framework = new Framework(chassis);
        //最后组成汽车
        Car car = new Car(framework);
        car.run();
    
    /**
     * 车类
     */
    static class Car 
        private Framework framework;
        public Car(Framework framework) 
            this.framework = framework;
        
        public void run() 
            framework.init();
        
    
    /**
     * 车身类
     */
    static class Framework 
        private Chassis chassis;
        public Framework(Chassis chassis) 
            this.chassis = chassis;
        

        public void init() 
            chassis.init();
        
    
    /**
     * 底盘类
     */
    static class Chassis 
        private Tire tire;
        public Chassis(Tire tire) 
            this.tire = tire;
        

        public void init() 
            tire.init();
        
    
    /**
     * 轮胎类
     */
    static class Tire 
        private int size;
        public Tire(int size) 
            this.size = size;
        
        public void init() 
            System.out.println("车轮大小为 "+this.size);
        
    

IoC创建类的顺序:从小到大

轮胎->底盘->车身->Car

  • 创建类的顺序发送的改变(反转)
  • 底层调用类发生改变之后,IoC模式整个调用链上的代码是无需修改的实现了类与引用类的解耦,但传统开发方式是不行的
  • 之前如果需要使用依赖,需要自己创建并管理类的生命周期,IoC无需自己管理对象的生命周期

小结

传统开发创建汽车的顺序是

Car -> 车身->底盘->车轮->执行run:从大到小

IoC开发创建类的顺序是:从小到大

轮胎->底盘->车身->Car

通⽤程序的实现代码,类的创建顺序是反的

而改进之后的控制权发⽣的反转,不再是上级对象创建并控制下级对象了,⽽是下级对象把注⼊将当前对象中,下级的控制权不再由上级类控制了,这样即使下级类发⽣任何改变,当前类都是不受影响的,这就是典型的控制反转,也就是 IoC 的实现思想

DI(依赖注入)

在IoC容器启动的时候,动态将对象注册到容器中的一种手段

在创建当前类的时候,动态的将当前类的依赖对象注入(注册)进来的过程就叫做DI(依赖注入)

比如这里创建Car,而Car依赖于车身类。所有在创建 汽车类的时候需要把它的依赖类 Framework 动态的注入进来

/**
     * 车类
     */
    static class Car 
        private Framework framework;
        public Car(Framework framework) 
            this.framework = framework;
        
        public void run() 
            framework.init();
        
    

IoC和DI的区别

IOC是控制反转,它是一种设计思想;DI他是实现手段

比如现在心情比较好,我是说晚上要去吃个夜宵,这就是思想

晚上具体吃啥?吃火锅也就是实现手段

IoC通过控制反转可以实现依赖类之间的解耦,让我们不在关心依赖类的具体实现和生命周期,我们只要使用依赖类的时候,把依赖类注入进来就好了,在底层依赖类发生改变的时候无需关心它的实现。

IoC就是把之前我们需要自己创建的对象交给其它人,无需关心对象的创建细节,需要的时候直接拿过来用就好了

DI是IoC的一种具体实现手段,指的是程序在运行的时候动态的将对象注入到当前类的一种实现机制

如果当前类需要引入依赖类了,就可以把依赖类动态的注入到当前类中,让当前类可以引用到依赖类

IoC是指导思想,DI是实现手段

总结

Spring 是什么?如何理解 Spring?

Sping是包含了众多工具方法IoC容器,对象的创建和销毁的权利都交给 Spring 来管理了,它本身⼜具备了存储对象和获取对象的能力

学 Spring 最核⼼的功能,就是学如何将对象存⼊到 Spring 中,再从 Spring 中获取对象的过

将对象存放到容器中的好处:将对象存储在 IoC 容器相当于将以后可能⽤的所有⼯具制作好都放到仓
库中,需要的时候直接取就⾏了,⽤完再把它放回到仓库。⽽ new 对象的⽅式相当于,每次需要⼯具
了,才现做,⽤完就扔掉了也不会保存,下次再⽤的时候还得重新做,这就是 IoC 容器和普通程序开
发的区别。

IoC和DI的区别

IoC是指导思想,DI是实现手段

Spring 最核⼼的功能是啥 ?

管理对象

把对象动态的注册到Spring当中,再从Spring当中把对象取出来


以上是关于Spring的IOC&DI的主要内容,如果未能解决你的问题,请参考以下文章

Spring------IOC&DI

AOP &IOC&事务&Spring源码

Spring的IOC&DI

Spring--IoC&AOP

3.Spring系列之IOC&DI

spring aop & ioc 容器