依赖注入 DI

本文详细介绍了Spring框架中的依赖注入(DI)原理,包括基于field、Setter和构造器的三种注入方式。Spring团队推荐使用构造器注入处理强制依赖,setter注入用于可选依赖,以确保对象的完整性和可测试性。

目录

基于field注入

基于Setter注入

基于构造器注入


基于field注入

所谓基于field注入,就是在bean的变量上使用注解进行依赖注入。本质上是通过反射的方式直接注入到field。是平常开发中经常看到的一种方式,也是Spring团队所不推荐的方式,注解方式:

@Autowired
private Svc svc;

配置文件方式

          //xml方式配置DI(基本类型)
          <?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="phone" class="co
依赖注入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]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骆驼整理说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值