控制反转和依赖注入

一、控制反转 IoC

1.1 什么是控制反转

**IOC **(Inversion of Control,控制反转)是面向对象编程中的一种设计思想,将程序中创建对象的控制权交给外部环境(Spring 框架、IoC 容器 )来管理,以便降低计算机代码之间的耦合度。

IoC 容器是用来实现 IoC 的载体,负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。在传统的编程模式中,程序员负责创建和管理对象及其依赖关系,而在控制反转的设计中,这些控制权被转移到外部容器或框架,程序员只需关注业务逻辑,具体的对象创建和管理由容器负责。

例如,现有类 A 依赖于类 B

  • 传统的开发方式 : 类A会直接在其代码中通过 new 关键字创建类B的实例。

    // 传统方式创建对象及其依赖对象
    public class A{
        private B dependency = new B();
    
        public void doSomething() {
            dependency.performTask();
        }
    }
    
  • 使用 IoC 思想的开发方式 : 通过IoC容器(例如Spring容器),我们可以将类 A 的依赖(类 B )从外部注入,而不是在类A内部直接创建。

    // 使用IOC容器后的对象声明方式
    public class IoCApplication {
        private B dependency;
    
        // 依赖注入(方法注入)
        public IoCApplication(B dependency) {
            this.dependency = dependency;
        }
    
        public void doSomething() {
            dependency.performTask();
        }
    }
    

1.2 IoC 的实现方法

控制反转的实现方式主要有以下几种:

  • 依赖注入(Dependency Injection,DI):通过构造函数、属性或方法参数传入依赖对象,使得对象的依赖关系在运行时由外部容器管理

  • 依赖查找(Dependency Lookup):组件需要自己从容器或上下文中查找和获取依赖对象。

1.3 IoC 在 Spring 中的支持模块

[Bean 的循环依赖.md](Bean 的循环依赖.md)

  • spring-core:Spring 框架基本的核心工具类。

  • spring-beans:提供对 bean 的创建、配置和管理等功能的支持。

  • spring-context:提供对国际化、事件传播、资源加载等功能的支持。

  • spring-expression:提供对表达式语言(Spring Expression Language) SpEL 的支持,只依赖于 core 模块,不依赖于其他模块,可以单独使用。

二、依赖注入 DI

2.1 依赖注入

依赖注入(DI)是一个过程,对象仅通过构造函数参数、工厂方法的参数或在对象实例构造或从工厂方法返回后设置的属性来定义其依赖项(即它们使用的其他对象)。然后,IoC容器在创建bean时注入这些依赖项。这个过程基本上是bean本身的逆过程(因此称为控制反转),通过使用类的直接构造或服务定位器模式来控制其依赖关系的实例化或位置。

在 Spring 框架里面,依赖注入的最大亮点是所有的 Bean 对 Spring 容器的存在没有意识。我们甚至可以将 Spring 容器替换成其他的容器。

2.2 依赖注入的实现方式

在依赖注入的实现方式里面,最常用的是构造函数注入和 setter 方法注入。

  • 构造函数注入:依赖对象通过构造函数传入。

    public class Service {
        private Repository repository;
        
        public Service(Repository repository) {
            this.repository = repository;
        }
    }
    
  • 属性注入(也叫 setter 方法注入):依赖对象通过公共属性设置。

    public class Service {
        private Repository repository;
        
         public void setRepository(Repository repository) {
            this.repository = repository;
        }
    }
    
  • 方法注入:依赖对象通过方法(例如工厂方法)参数传入。

    public class Service {
        
        public void doSomething(Repository repository) {
            repository.dosomething();
        }
    }
    

具体细节查看 Dependency Injection :: Spring Framework

参考资料

Introduction to the Spring IoC Container and Beans :: Spring Framework

Dependency Injection :: Spring Framework

Spring IOC深度解析:IOC容器的原理与高级特性详解_ioc容器的原理,深入理解如何通过反射和继承机制实例化类-优快云博客

Spring常见面试题总结 | JavaGuide

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值