IOC控制反转&&DI依赖注入的方法论

本文涉及的产品
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
简介: 控制反转(IoC)是面向对象编程中用于减少代码耦合的设计原则。传统编程中,对象通过`new`关键字创建,控制权在应用手中。而在Spring框架下,对象由IoC容器管理并创建,通过依赖注入(DI)机制,自动将所需资源注入对象中,从而实现对象间的解耦。DI有两种实现方式:构造方法注入和属性setter方法注入。通过IoC和DI,程序更易于维护和测试。

1 IoC 控制反转

控制反转(Inversion of Control,缩写为IoC)是面向对象编程中的一个设计原则,用来降低程序代码之间的耦合度。在传统面向对象编程中,获取对象的方式是用new关键字主动创建一个对象,也就是说应用程序掌握着对象的控制权。传统面向对象程序设计原则如图,其中商品类和商品信息类都要有业务代码直接通过new创建,然后再将对象组合使用,这样会导致类与类之间高耦合,并且难以测试。

image.png

因此,在使用Spring框架后,对象的实例化就不再由调用者来创建,而是由Spring的IoC容器来创建,IoC容器会负责控制程序之间的关系,而不是由调用者的程序代码直接控制。

IoC控制反转机制指的是对象由Ioc容器统一管理,当程序需要使用对象时,可以直接从IoC容器中获取。这样对象的控制权就从应用程序转移到了IoC容器,控制权发生了反转。IoC设计原则如图,它是借助于IoC容器实现具有依赖关系对象之间的解耦,各个对象类封装之后,通过IoC容器来关联这些对象类。

image.png

DI 依赖注入

依赖注入(Dependency Inject,缩写DI)就是由IoC容器在运行期间动态地将某种依赖资源注入对象之中。例如,将对象B注入(赋值)给对象A的成员变量。依赖注入的基本思想是:明确地定义组件接口,独立开发各个组件,然后根据组件的依赖关系组装运行。

依赖注入(DI)和控制反转(IoC)是从不同角度来描述了同一件事情。依赖注入是从应用程序的角度描述,即应用程序依赖IoC容器创建并注入它所需要的外部资源;而控制反转是从IoC容器的角度描述,即IoC容器控制应用程序,由IoC容器反向地向应用程序注入应用程序所需要的外部资源。这里所说的外部资源可以是外部实例对象,也可以是外部文件对象等。

依赖注入的作用就是在使用Spring框架创建对象时,动态的将其所依赖的对象注入到Bean组件中。

依赖注入通常有两种实现方式,一种是构造方法注入,另一种是属性setter方法注入

构造方法注入

构造方法注入是指Spring容器调用构造方法注入被依赖的实例,构造方法可以是有参的或者是无参的。Spring在读取配置信息后,会通过反射方式调用实例的构造方法,如果是有参构造方法,可以在构造方法中传入所需的参数值,最后创建类对象。

小小案例:

① 创建实体类User,并创建有参构造方法

package com.lq.entities;
/**
 * @Author: Luqing Teacher
 * @CreateTime: 2024-11-27
 * @Description: 用户类,依赖注入
 * @Version: 1.0
 */
public class User {
    private int id;
    private String name;
    private String pwd;
    /**
     * 构造方法,通过构造进行依赖注入
     * @param id
     * @param name
     * @param pwd
     */
    public User(int id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }
}

② 创建配置文件applicationContext-user.xml,并写入实体bean并赋值

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="user" class="com.lq.entities.User">
        <constructor-arg name="id" value="1"/>
        <constructor-arg name="name" value="lq"/>
        <constructor-arg name="pwd" value="123"/>
    </bean>
</beans>

<constructor-arg>元素

一个<constructor-arg>元素表示构造方法的一个参数,且定义时不区分顺序,只需要通过<constructor-arg>元素的name属性指定参数即可。<constructor-arg>元素还提供了type属性类指定参数的类型,避免字符串和基本数据类型的混淆。

③ 创建测试类TestUser

package com.lq.test;
import com.lq.entities.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
 * @Author: Luqing Teacher
 * @CreateTime: 2024-11-27
 * @Description: 测试USer
 * @Version: 1.0
 */
public class TestUser {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-user.xml");
        User user = applicationContext.getBean("user", User.class);
        System.out.println(user);
    }
}

④ 输出结果如下:

image.png

相关文章
|
5月前
|
SQL 存储 关系型数据库
MySQL误删/批量更新数据恢复实战:基于Flashback工具的完整方案
本文介绍MySQL闪回技术,对比主流工具binlog2sql、MyFlash和my2sql,详解基于my2sql的误操作恢复流程,涵盖原理、实操步骤与预防措施,助力高效恢复批量数据误删/误改问题。
659 0
MySQL误删/批量更新数据恢复实战:基于Flashback工具的完整方案
|
5月前
|
XML Java 数据库连接
Spring Boot集成MyBatis
MyBatis是Apache顶级持久层框架,简化SQL操作,支持XML与注解映射。本文详解Spring Boot集成MyBatis的两种方式:基于XML和注解,重点讲解注解配置,涵盖依赖引入、yml配置、驼峰命名转换及@MapperScan使用,并结合实战示例,提升开发效率,适用于实际项目应用。(238字)
|
存储 人工智能 安全
【实测分享】本地AI工具AiPy更新版本v0.1.28
AiPy是一款出色的本地AI工具,2025年5月21日发布v0.1.28版本。它以本地化处理保障数据隐私,新增Trustoken联网搜索、云端私密存储等功能,支持多模型选择如阿里Qwen与腾讯Hunyuan,优化任务处理逻辑,提升效率。操作便捷升级,新老用户均可轻松上手。未来还将推出GUI客户端2.0等新功能,值得期待!(下载地址:https://www.aipyaipy.com/#download)快来体验吧!
【实测分享】本地AI工具AiPy更新版本v0.1.28
|
人工智能 算法
Runway Gen-4:AI视频生成新纪元!高保真特效一键生成影视级内容
Runway Gen-4是新一代AI视频生成模型,通过参考图和文字指令即可生成具有物理真实感、叙事连贯性的高质量视频内容,支持与实拍素材无缝融合。
1060 9
Runway Gen-4:AI视频生成新纪元!高保真特效一键生成影视级内容
不是,哎呦~~,你怎么还是不会字母大小写的相互转化啊~
不是,哎呦~~,你怎么还是不会字母大小写的相互转化啊~
|
监控 安全 测试技术
深入理解并实践微服务架构中的服务治理
深入理解并实践微服务架构中的服务治理
756 1
|
SQL 分布式计算 DataWorks
DataWorks操作报错合集之遇到“访问被拒绝-授权失败,没有权限" 错误,提示“Access Denied - Authorization Failed [4019]”,该怎么办
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
DataWorks操作报错合集之遇到“访问被拒绝-授权失败,没有权限" 错误,提示“Access Denied - Authorization Failed [4019]”,该怎么办
|
JSON Rust JavaScript
🎉使用Tauri+vite+koa2+mysql开发了一款待办效率应用
这是一个基于tauri+vite的应用,它采用了一些最新的前端技术,包括 Tauri、Vue3、Vite5、koa2 和 mysql。它提供了丰富的效率管理工具。
437 8
|
SQL 分布式计算 Oracle
CDH 搭建_Hive_安装和创建用户|学习笔记
快速学习 CDH 搭建_Hive_安装和创建用户
1135 0
|
设计模式 测试技术 容器
依赖注入与控制反转:理解与应用
【8月更文挑战第22天】
759 0