什么是依赖注入

简介: 依赖注入的四种方法介绍。

废话

1. 为了提升自己的学习效率,通过写博客的方式从被动学习转化为一定程度的主动学习。

2.有一件每天都能坚持做的事情,可能更让人有或者的感觉?

在读《单元测试的艺术》的绪论的时候,有很多不懂的名词,就去查了一下,一些印象深刻的就记了些笔记。

Mostly I stopped using property setters and am mostly using constructor injection.

什么是依赖注入(Dependency Injection)

依赖注入是用来实现代码的松耦合的一种模式。如果一个对象需要进行另一个对象的创建,管理等过程,这样就会带来一种紧耦合。

例子:在一个游戏里面,我是一个武士,我有一把剑,我拿剑攻击。

///剑的类classSword{
publicvoidHit(stringtarget)
    {
Console.WriteLine("Chopped {0} clean in half", target);
    }
}
///武士的类,会用到那把剑,所以在里面新建了一个剑的实体classSamurai{
readonlySwordsword;
publicSamurai() 
    {
this.sword=newSword();
    }
publicvoidAttack(stringtarget)
    {
this.sword.Hit(target);
    }
}
///主函数,武士拿着剑去攻击别人classProgram{
publicstaticvoidMain() 
    {
varwarrior=newSamurai();
warrior.Attack("the evildoers");
    }
}


这里的武士就依赖于剑这个实体,是一种紧耦合。因为当我想给这武士换一把武器的时候。我需要去修改武士这个类的实现。

根据依赖倒置原则(DIP):高层模块不应该依赖于底层模块,二者都应该依赖于抽象。针对接口编程,不要针对实现编程。

这里Sword类就是底层模块,而我们以上用的方法就属于针对实现的编程。

那应该怎么修改呢?

///剑的抽象 是武器interfaceIWeapon{
voidHit(stringtarget);
}
///底层模块是剑,它应该依赖于武器这个抽象接口(继承,实现也是一种依赖关系)。classSword : IWeapon{
publicvoidHit(stringtarget) 
    {
Console.WriteLine("Chopped {0} clean in half", target);
    }
}


  1. 属性注入
///高层模块 是武士,他也应该依赖于武器这个抽象接口(组合也是一种依赖关系)///这就是一种属性注入(property injection),将武器作为武士的一种属性,通过特定函数来设置它classSamurai{
IWeaponweapon;
publicSamurai() { }
publicvoidSetWeapon(IWeaponweapon)
    {
this.weapon=weapon;
    }
publicvoidAttack(stringtarget) 
    {
this.weapon.Hit(target);
    }
}


  1. 构造注入
///将武器作为武士的构造器的参数传入classSamurai{
readonlyIWeaponweapon;
publicSamurai(IWeaponweapon) 
    {
this.weapon=weapon;
    }
publicvoidAttack(stringtarget) 
    {
this.weapon.Hit(target);
    }
}


  1. 方法注入
classSamurai{
publicvoidAttack(stringtarget, IWeaponweapon) 
    {
weapon.Hit(target);
    }
}

以上就是实现依赖注入的三种方式

  1. Constructor Injection
  2. Setter or property Injection
  3. Method Injection

还有第四种,我还没有学到。

  1. Service Locator Injection

还有这几种方式的优劣或者适用场景还有待学习,希望后续能够继续学习,继续分享。

参考:

https://softwareengineering.stackexchange.com/questions/177649/what-is-constructor-injection

https://www.c-sharpcorner.com/article/understanding-the-dependency-injection-using-constructor-property-and-method-in/

https://blog.csdn.net/qq_34760445/article/details/82931002

相关文章
|
XML Java 数据格式
依赖注入~
依赖注入~
|
Java 测试技术 容器
Spring框架-ObjectProvider更加宽泛的依赖注入
从上面的过程中我们可以看出,但Spring中某个Bean的依赖类型为ObjectProvider时,我们不需要提供一个ObjectProvider类型的Bean到容器中,只需要提供一个T类型的Bean到容器中,容器会自动将其包装成一个ObjectProvider,然后注入到依赖中
187 0
|
2月前
|
设计模式 Java 开发者
面向切面编程和依赖注入
【9月更文挑战第6天】在软件开发中,面向切面编程(AOP)和依赖注入(DI)是提升代码可维护性、可扩展性和可测试性的关键概念。AOP 通过将横切关注点(如日志记录、事务管理)从业务逻辑中分离并模块化管理,增强了代码的清晰度和灵活性;DI 则通过外部容器管理对象间的依赖关系,降低了对象耦合度,使代码更易测试和维护。两者结合使用能显著提升软件开发效率和质量。
|
3月前
|
设计模式 测试技术 容器
依赖注入与控制反转:理解与应用
【8月更文挑战第22天】
116 0
|
XML 开发框架 Java
Spring框架IoC控制反转
Spring是与2003年兴起的一个轻量级的Java开发框架,它是为了解决企业应用开发的复杂性而创建的。Spring的核心是控制反转(IOC)和面向切面编程(AOP)。Spring是可以在Java SE/EE中使用的轻量级开源框架。 Spring的主要作用就是为代码"解耦",降低代码间的耦合度。就是让对象和对象(模板和模板)之间关系不是使用代码关联,而是通过配置来说明。即在Spring中说明对象(模块)的关系。 Spring根据代码的功能特点,使用IOC降低业务对象之间耦合度。IOC使得主业务在相互调用过程中,不用再自己维护关系了,即不用再自己创建要使用的对象了,而是由Spring容器统一
81 2
|
设计模式 Java Spring
依赖注入
依赖注入
|
Java Maven
SpringFrame-ioc 依赖注入
SpringFrame-ioc 依赖注入
|
容器
05 依赖注入-自动装配
用于引用类型的依赖注入
77 0
|
SQL 开发框架 安全
3.1依赖注入
传统开发中,对象都是开发者创建组装,开发者必须了解各类的使用方法且某些类的耦合度较高,例如想把sql serve数据库改为MySql数据库则需要更改某些代码。控制反转的目的是让框架完成对象的创建和组装。从“我创建对象”编程“我要对象”
|
程序员 容器
控制反转与依赖注入
控制反转与依赖注入
128 0
控制反转与依赖注入