您现在的位置是:首页 >技术交流 >Spring-IoC网站首页技术交流

Spring-IoC

小小liao 2024-06-17 10:13:27
简介Spring-IoC

Spring的介绍

框架:大佬把一基本操作进行封装;就好比自定义http服务器封装性很差劲;所以我们就使用servlet;这也是一个框架。Servlet到Spring如同骑几十年自行车的你;突然发现还有电瓶车这种好东西。

spring:包含众多工具和方法的IoC容器。
IoC容器:Inversion of Control;控制反转的容器。spring是一个控制反转的容器。
举例:什么的控制反转
比如A程序依赖B程序;那么A就控制着B程序的生命周期;我们在创建A的时候就得实现B;然后如果B发送改变后;比如参数变化;那我A的程序也得跟着变化。耦合高了。
实现一个生产汽车的示例:

public class Car {
public  void init(){

    System.out.println("do car");
    //  车的使用要依赖车身
    Framework framework=new Framework();
    framework.init();
}

    public static void main(String[] args) {
        Car car=new Car();
        // 新建一个车 ;使用这个车
        car.init();

    }
}

 class Framework {
    public void init(){

        System.out.println("do Framework");
//    车身的使用要依赖底部
        Bottom bottom=new Bottom();
        bottom.init();

    }


}

 class Bottom {
    public void init() {
        System.out.println("do Bottom");
// 底部的使用要依赖车轮
        Tire tire=new Tire();
        tire.init();
    }



}


class Tire {
    public int size=17;
    //  车轮的长度只能固定
    public void  init(){

        System.out.println("size->"+size);
    }


}

这个示例的依赖关系非常紧密;当我们想在不同场景使用不同尺寸轮胎;那就挺难办的。Tire的init方法加个参数size;那这个参数来自用户;就得经过车、车身、车底把这参数传过来。我们四个类的代码都要修改。如果还有演示、大小等等属性我们自己去控制这些依赖就很难办。
IoC:转移控制权。生命周期就变成别人的;控制权反转。

package newcar;

public class Car {
    public Framework framework;
    public Car(Framework framework){
        this.framework=framework;

    }
    public void init() {
        System.out.println("do car...");
        framework.init();
    }
}

class Framework {
    public Bottom bottom;
    public Framework(Bottom bottom) {
        this.bottom = bottom;
    }

    public void init() {
        System.out.println("do framework...");
        bottom.init();
    }
}

class Bottom {
    private Tire tire;

    public Bottom(Tire tire) {
        this.tire = tire;
    }

    public void init() {
        System.out.println("do bottom...");
        tire.init();
    }
}

class Tire {
    private int size = 17;
    private String color = "红色";

    public Tire(int size, String color) {
        this.size = size;
    }

    public void init() {
        System.out.println("size -> " + size + " | color -> " + color);
    }
}

修改后的代码以参数的形式拿到它的依赖类;很好的实现解耦。

在这里插入图片描述
如果是spring框架;依赖生命周期等的管理就交给第三方;IoC的用途是解耦;但不局限于。IoC是一种思想;把控制权交给别人管理。
传统的建车:先建车;发现要依赖车身;那就建车身;依赖车底建车底;依赖车轮就建车轮。
IoC的思想:先建好车轮(想要什么尺寸就建什么尺寸)再建车底;车身;车。

容器:
spring这个Ioc容器的作用:将对象存和取;bean对象;类对象。对象的创建和销毁都交给spring;这个容器也有储存和获取对象的能力。
解耦的同时还能提高效率;就跟要的工具我已经事先储存在容器里;而不是要用的时候才创建。还能帮你解决死锁;循环依赖的问题。
(让我们更偏向使用权;而不是拥有权;比如共享汽车。我不需要关注;保养;年新;保险;停在哪;轮胎不行;或者机油;刹车油不行都得换等等;停车费也不便宜;很多麻烦事。在家停也得要钱;就回老家;下雨的时候开。停车费。租车;有专门停放共享汽车的地。保险费也得花费不少。)

总结:spring Ioc优点
1:解耦
2:使用更加方便(比如我要车身;你给我给车身我就能造车;不需要关注后面的依赖情况)
3:高效;默认单例;跟线程池一样;只创建一次。除了第一次;事先创建好;后面就可以直接使用;而不是要用的时候再创建。

DI

DI:依赖注入;将依赖的某个对象拿到当前类当中(底层是先是动态代理;动态代理底层是反射)
IoC相当于是一种思想;而DI是一种具体的实现;DI是一种主动获取对象的方式。传参数;被动的;得别人传给你;你才能接收。主动是我自己主动获取。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。