DI依赖注入环境

Posted yzx-sir

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DI依赖注入环境相关的知识,希望对你有一定的参考价值。

我还是在跟着狂神来学习Spring5

1.构造器注入
2.Set方式注入【重点】
3.扩展方式注入

我在这里记录一下set依赖注入的步骤吧

Set方式注入:
分为依赖:bean对象的创建依赖于容器 注入: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="address" class="org.example.pojo.Address">
        <property name="address" value="河北石家庄"></property>
    </bean>
    <bean id="student" class="org.example.pojo.Student">
        <!--第一种,普通值注入:value-->
        <property name="name" value="yezhaoxin"></property>

        <!--第二种,Bean注入:ref-->
        <property name="address" ref="address"></property>
        <!--第三种,数组注入:方式1.array-->
        <property name="books">
            <array>
                <value>1.数组注入</value>
                <value>2.通过array</value>
                <value>3.String[] books</value>
            </array>
        </property>
        <!--第三种,数组注入:方式2.list-->
        <property name="hobbys">
            <list>
                <value>1.数组注入方式2</value>
                <value>2.通过list</value>
                <value><!--3.List<String> hobbys--></value>
            </list>
        </property>

        <!--第三种,数组注入:方式3: Map-->
        <property name="card">
            <map>
                <entry key="身份证" value="411525"></entry>
                <entry key="银行卡" value="123456"></entry>
            </map>
        </property>

        <!--第三种,数组注入:方式4: Set-->
        <property name="game">
            <set>
                <value>1.数组注入方式4</value>
                <value>2.通过Set</value>
                <value><!--3.Set<String> game--></value>
            </set>
        </property>

        <!--第四种,空值注入-->
        <property name="wife">
            <null/>
        </property>

        <!--特殊类型注入-->
        <property name="info">
            <props>
                <prop key="学号">20213709</prop>
                <prop key="性别">男</prop>
                <prop key="姓名">小叶</prop>
            </props>
        </property>


    </bean>

</beans>

第三步,书写测试类输出所有信息

测试结果

PS.遇到的问题

数组定义的books

但是不能使用,输出时出现这种情况

检查了一下,发现定义实体类的时候返回值出现了问题
将原本的返回这books,修改成下面图片的形式就可以了

不知道这是不是强制转换

一文搞懂│php 中的 DI 依赖注入

✨ 目录

🎈 什么是 DI / 依赖注入

  • 依赖注入DI 其实本质上是指对类的依赖通过构造器完成 自动注入
  • 通俗来说,就是你当前操作一个类,但是这个类的某些方法或者功能不是单单只靠这个类就能完成的,而是要 借助另一个类 的才能完成的
  • 最直接的标志就是传参数据为对象的时候。严格来说,你想在一个类中操作另一个类,这两个类之间形成了相互依赖关系,传参的方式叫 注入

🎈 依赖注入出现的原因

  • 在未使用依赖注入的时候,php 需要在一个类中使用另一个类的时候,往往都会进行如下操作
  • 比如我在 container 类中需要用到 adapter 类,就需要在使用之前进行实例化
  • 如果需要用到大量的外部类,这就会造成了 耦合度太高,很容易造成后期的 维护困难
  • 通俗的来讲,也就是 container 脱离不了外部类去工作,这就叫 耦合度太高
<?php
class container

    private $adapter;

    public function __construct()
    
        $this->adapter = new adapter();
    

🎈 简单的依赖注入

  • 上面的代码耦合度太高,导致了 依赖注入 的出现,主要是为了 解耦合
  • 如下案例,我们只需要将所需要操作的类对象传入即可
  • 依赖注入 操作的参数是 对象,而不是普通参数,是不是有更好的理解了
  • 但是这样的简单依赖注入,会造成如果你依赖的类很多,你传参的时候会很长,容易混乱
<?php
class container

    private $adapter;

    public function __construct(adapter $adapter)
    
        $this->adapter = $adapter;
    

🎈 高阶的依赖注入

  • 为了解决上面 参数混乱 的问题,这时候,依赖注入进行了优化
    通过魔术方法,__get 去设置对象
  • 这时候,我们就可以解决依赖太多,参数混乱的问题了
<?php
class container

    public $instance = [];

    public function __set($name, $value)
    
        $this->instance[$name] = $value;
    


$container = new container();

$container->adapter = new adapter();
$container->autofelix = new autofelix();

🎈 依赖注入的应用

  • 我们先定义一个 容器类,主要用来向容器中 注入 你想要操作的类
  • 使用的时候,只需要传容器这一个 对象 即可
<?php
class container

    public $instance = [];

    public function __set($name, $value)
    
        $this->instance[$name] = $value;
    


class adapter

    public $name = '我是调度器';


$container = new container();
$container->adapter = new adapter();

class autofelix

    private $container;

    public function __construct(container $container)
    
        $this->container = $container;
    

    public function who($class)
    
        return $this->container->instance[$class]->name;
    


$autofelix = new autofelix($container);

$who = $autofelix->who('adapter');

var_dump($who); //我是调度器

🎈 依赖注入高阶优化

  • 在上面的应用中,我们 直接 将实例化后的对象注入容器中
  • 这样会导致,所有的对象还没有被使用就会被实例化一遍,造成 资源的损耗
  • 我们可以 传入闭包,这样对象就不会被实例化而注入,当你自己需要使用的时候,再去实例化,就可以减少 服务器资源的损耗
<?php
$container = new container();
$container->adapter = new adapter();

//高阶优化
$container = new container();
$container->adapter = function () 
    return new adapter();
;

以上是关于DI依赖注入环境的主要内容,如果未能解决你的问题,请参考以下文章

Spring依赖注入

Spring中IOC与DI的的区别

一文搞懂│php 中的 DI 依赖注入

一文搞懂│php 中的 DI 依赖注入

一文搞懂│php 中的 DI 依赖注入

Spring核心容器环境配置创建依赖注入等