10分钟理解依赖注入

简介: 看到网络上很多“依赖注入”解释的话题,这篇博客呢也只是我自己的观点,如果你有不同的观点请拍砖,不用客气。 业务场景 小明要去旅游,但是还未确定以什么方式出游,有可能是徒步旅行,也有可能是自驾游。 代码演示 根据步行和驾车的速度来考虑距离旅游目的地的路程,所以这里定义了两个属性$speed和$

看到网络上很多“依赖注入”解释的话题,这篇博客呢也只是我自己的观点,如果你有不同的观点请拍砖,不用客气。

业务场景

小明要去旅游,但是还未确定以什么方式出游,有可能是徒步旅行,也有可能是自驾游。

代码演示

根据步行和驾车的速度来考虑距离旅游目的地的路程,所以这里定义了两个属性$speed$distance。所有有了如下代码:

interface travelInterface{
 
    public function __construct($speed, $distance);
 
    public function run();
}
 
abstract class travel implements travelInterface{
     
    protected $speed; // 最高时速
    protected $distance; // 最远路程
 
    public function __construct($speed, $distance)
    {
        $this->speed = $speed;
        $this->distance = $distance;
    }
     
}
 
class drive extends travel{
     
    public function run()
    {
        echo "自驾游";
    }
}
 
class walk extends travel{
     
    public function run()
    {
        echo "徒步旅行";
    }
}

如果是选择自驾游

class human
{
    protected $travel; // 出行方式
 
    public function __construct()
    {
        $this->travel = new drive(60,1000);
    }
 
    public function traveling(){
        $this->travel->run();
    }
}
 
$xiaoming = new human();
$xiaoming->traveling();

那么,如果需要换一种出行方式的时候,则需要修改human类。这里看起来修改非常简单,但是我们实际项目中可能会夹杂着很多的业务逻辑一起修改。

就说下依赖注入的基础方式

class human
{
    protected $travel; // 出行方式
 
    public function __construct(travel $travel)
    {
        $this->travel = $travel;
    }
 
    public function traveling(){
        $this->travel->run();
    }
}
 
$travel = new drive(60,1000);
$xiaoming = new human($travel);
$xiaoming->traveling();

什么是依赖注入

简单的说:在A类中使用了B类的实例时,B对象的构造不是在A类某个方法中初始化的,而是在A类外部初始化之后以B类的对象传入进来。这个过程就是依赖注入。

换一种通过配置文件来实现控制反转

$config = [
    "travel" => drive::class,
];
 
$travel = new $config["travel"](60,1000);
$xiaoming = new human($travel);
$xiaoming->traveling();

通过上面的方式,以什么方式旅行,只需要修改配置$config就行。

这在我们PHP里感触不明显,觉得修改$config和修改$travel = new drive(60,1000)差别不到,一方面是便于管理,另一方面是PHP的非编译型的特性优势。如果用Java来实现,感触就非常明显了,比如程序已经打包了,只需要修改配置文件,就可以控制类的依赖关系了。起到了解耦的作用。

虽然很多时候大家一说到控制反转,依赖注入,就非要和说到反射,我觉得上面IOC只是一种思想,具体的实现方式,在不同的语言中有不同的表现形式。只要将这种依赖关系解耦出来,可以配置化就是IOC的实现了。

原文地址:https://mengkang.net/790.html




目录
相关文章
|
6月前
|
XML Java 数据格式
依赖注入~
依赖注入~
|
6月前
|
Java 测试技术 容器
Spring框架-ObjectProvider更加宽泛的依赖注入
从上面的过程中我们可以看出,但Spring中某个Bean的依赖类型为ObjectProvider时,我们不需要提供一个ObjectProvider类型的Bean到容器中,只需要提供一个T类型的Bean到容器中,容器会自动将其包装成一个ObjectProvider,然后注入到依赖中
91 0
|
7月前
|
XML 开发框架 Java
Spring框架IoC控制反转
Spring是与2003年兴起的一个轻量级的Java开发框架,它是为了解决企业应用开发的复杂性而创建的。Spring的核心是控制反转(IOC)和面向切面编程(AOP)。Spring是可以在Java SE/EE中使用的轻量级开源框架。 Spring的主要作用就是为代码"解耦",降低代码间的耦合度。就是让对象和对象(模板和模板)之间关系不是使用代码关联,而是通过配置来说明。即在Spring中说明对象(模块)的关系。 Spring根据代码的功能特点,使用IOC降低业务对象之间耦合度。IOC使得主业务在相互调用过程中,不用再自己维护关系了,即不用再自己创建要使用的对象了,而是由Spring容器统一
52 2
|
11月前
|
设计模式 Java Spring
|
12月前
|
Java Maven
SpringFrame-ioc 依赖注入
SpringFrame-ioc 依赖注入
|
12月前
|
容器
05 依赖注入-自动装配
用于引用类型的依赖注入
53 0
|
SQL 开发框架 安全
3.1依赖注入
传统开发中,对象都是开发者创建组装,开发者必须了解各类的使用方法且某些类的耦合度较高,例如想把sql serve数据库改为MySql数据库则需要更改某些代码。控制反转的目的是让框架完成对象的创建和组装。从“我创建对象”编程“我要对象”
|
程序员 容器
控制反转与依赖注入
控制反转与依赖注入
102 0
控制反转与依赖注入
|
Java 程序员 数据库
依赖注入IOC
依赖注入IOC
依赖注入的注解
依赖注入的注解——简单类型(8种基本类型+string)以及引用类型