依赖注入(DI)

本文介绍了依赖注入(DI)的概念及其在Spring框架中的应用。依赖注入有助于提高Java应用程序的组件独立性和可重用性,同时简化了单元测试过程。文章详细解释了依赖注入如何通过构造函数或setter方法实现类之间的关联。


依赖注入(DI)

Spring 最认同的技术是控制反转的依赖注入(DI)模式。控制反转(IoC)是一个通用的概念,它可以用许多不同的方式去表达,依赖注入仅仅是控制反转的一个具体的例子。

当编写一个复杂的 Java 应用程序时,应用程序类应该尽可能的独立于其他的 Java 类来增加这些类可重用可能性,当进行单元测试时,可以使它们独立于其他类进行测试。依赖注入(或者有时被称为配线)有助于将这些类粘合在一起,并且在同一时间让它们保持独立。

到底什么是依赖注入?让我们将这两个词分开来看一看。这里将依赖关系部分转化为两个类之间的关联。例如,类 A 依赖于类 B。现在,让我们看一看第二部分,注入。所有这一切都意味着类 B 将通过 IoC 被注入到类 A 中。

依赖注入可以以向构造函数传递参数的方式发生,或者通过使用 setter 方法 post-construction。由于依赖注入是 Spring 框架的核心部分,所以我将在一个单独的章节中利用很好的例子去解释这一概念。

依赖注入DI)是一种设计模式,用于减少对象之间的耦合度,提高代码的可维护性和可测试性。在传统模式下,当某个Java对象(调用者)需要调用另一个Java对象(被调用者,即被依赖对象)时,调用者通常会采用“new 被调用者”的代码方式来创建对象,这种方式会导致调用者与被调用者之间的耦合性增加,不利于后期项目的升级和维护[^4]。 依赖注入的核心思想是将对象的创建和依赖关系的管理从对象本身分离出来,交给一个外部的容器(DI容器)来负责。DI容器就像一个智能管家,负责登记服务和自动配送服务[^3]。在不同的框架和语言中,依赖注入的实现方式有所不同: ### .Net中的依赖注入 在 .Net 中,可以使用 `ServiceCollection` 构建一个服务容器,将需要服务容器管理的服务(对象)添加到服务容器,通过服务容器构建一个 `ServiceProvider`(服务提供器),它可以提供容器中管理的服务。以下是一个示例代码: ```csharp ServiceCollection serviceContainer = new ServiceCollection(); // 构建一个服务容器 serviceContainer.AddTransient<Chinese>(); // 把 Chinese 作为瞬态服务(对象),添加到服务器容器 // 通过容器构建一个 ServiceProvider(服务提供器),ServiceProvider 可以提供容器中管理的服务(已添加到容器的服务) using (ServiceProvider serviceProvider = serviceContainer.BuildServiceProvider()) { ISayHello sayHello = serviceProvider.GetService<Chinese>(); // 从 ServiceProvider 中获取需要的服务(对象) sayHello.SayHello(); } ``` 在 .Net 中,依赖注入有不同的生命周期,如 `Transient`(瞬态),每次请求服务时都会创建一个新的实例[^1]。 ### Spring中的依赖注入Spring 框架中,依赖注入通常通过配置文件实现。配置文件中的一些相关配置如下: - `bean`:配置一个bean对象,交由Spring接管。 - `id`:bean的唯一标识符,可以理解为 `new` 变量时的变量名。 - `class`:bean对象所对应的全限定类名。 - `name`:也是别名,而且该属性还能取多个别名。 - `scope`:作用域(这里了解 `singleton` 单例和 `prototype` 原型即可)。 - `autowire`:自动注入方式(`byName` 和 `byType`)。 - `alias`:别名,就是为一个bean对象可以取多个别名。 - `import`:用于将多个xml文件导入一个xml文件中,多用于协同开发,`resource` 指定导入的资源 [^2]。 ### ASP.NET Core中的依赖注入 在ASP.NET Core中,`builder.Services` 充当DI容器这个“智能管家”。通过 `builder.Services.AddScoped<ICoffeeBeans, ArabicaBeans>()` 登记服务,告诉容器当有人需要 `ICoffeeBeans` 时,提供 `ArabicaBeans` 实例。当创建 `CoffeeMaker` 时,容器会自动准备所需的实例并传给 `CoffeeMaker` 构造函数 [^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值