初探Spring - IOC原理

一、IOC是什么

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

举个例子:

如果我们想开车,一般人会努力工作,拼命挣钱,然后买车。还有另外一种选择,去租车行租车。对于前者,他只能开自己的车,而且需要自己负责车的保养、维修。而后者则可以随时换车,今天开大奔感觉不爽,明天换辆奥迪,而且无需对车进行保养和维修,自由度很大。

对应在程序设计中,第一种方式类似于:在Person类内部创建一个Car类的实例BMW,在类内部就将Car写死了,而且还要负责对BMW的创建、维护、回收。

而第二种方法则类似于:在Person中只创建一个Car的引用,而不将其实例化,待到程序运行中需要使用到Car时,动态的注入实例,可以传入BMW,Audi,Benz...不仅自由度高,耦合度低,且无需对实例进行管理维护。

第二种方案的实现代码:

1.主类

复制代码
public class PersonDrive {
    public static void main(String[] args) {
        ApplicationContext context = new FileSystemXmlApplicationContext("applicationContext.xml");
        Car car = (Car) context.getBean("Benz");
        Person person = new Person();
        person.setCarName(car.getName());
        person.drive();

        // 奔驰开烦了,换辆奥迪
        car = (Car) context.getBean("Audi");
        person.setCarName(car.getName());
        person.drive();
    }
}
复制代码

2.定义Car接口

public interface Car {
    public String getName();
}

 

3.Benz实现Car接口

复制代码
public class Benz implements Car {
    public String name;
    public String getName(){
        return this.name;
    }
    public void setName(String name){
        this.name=name;
    }
}
复制代码

 

4.Audi实现Car接口

复制代码
public class Audi implements Car {
    private String name;


    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
复制代码

 

5.Person类

复制代码
public class Person {
    private String carName;
    public void drive(){
        System.out.println("drive:"+carName);
    }
    public void setCarName(String name){
        this.carName=name;
    }
}
复制代码

 

6.配置applicationContext.xml文件

<bean id="Audi" name="Audi" class="com.crazyacking.IOCTest.Audi">
        <property name="name" value="Audi"></property>
    </bean>
    <bean id="Benz" name="Benz" class="com.crazyacking.IOCTest.Benz">
        <property name="name" value="Benz"></property>
    </bean>

 

运行输出:

drive:Benz
drive:Audi

 

posted @   北岛知寒  阅读(213)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示
主题色彩