Java之依赖注入(Dependency injection)

什么叫依赖注入?

先从普通的程序层面来理解一下:想象一下,在外面编写代码的过程中,当某个对象需要使用另一个对象时,一种方式是在内部直接将需要使用的对象创建出来使用。

class Ming extends Person
{
    private $_name;
 
    private $_age;
 
    public function  __construct()
    {
        $this->_name = '小明';
        $this->_age = 26;
    }
 
    function read()
    {
        //……  省略若干代码
        (new iPhone6())->read($this->_name); //逛知乎
    }
 
    function  play()
    {
        //……  省略若干代码
        (new iPhone6())->play($this->_name);//玩农药
 
    }
 
    function  grab()
    {
        //……  省略若干代码
        (new iPhone6())->grab($this->_name);//抢红包
 
    }
 
}

另一种方式是,提供一个接口,由外部调用者通过方法设置需要使用的对象值。

class Ming extends Person
{
    private $_name;
 
    private $_age;
 
    private $_phone; //将手机作为自己的成员变量
 
    public function  __construct($phone)
    {
        $this->_name = '小明';
        $this->_age = 26;
        $this->_phone = $phone;
        echo "小明起床了 \n";
    }
 
    function read()
    {
        //……  省略若干代码
        $this->_phone->read($this->_name); //逛知乎
    }
 
    function  play()
    {
        //……  省略若干代码
        $this->_phone->play($this->_name);//玩农药
 
    }
 
    function  grab()
    {
        //……  省略若干代码
        $this->_phone->grab($this->_name);//抢红包
 
    }
 
}

这种方式就是依赖注入,你所依赖的对象是需要通过外部调用来设置的,而且这里还体现了另一个设计原则, 那就是依赖于抽象 /接口。

接下来,从框架层面来理解一下:如果完全依赖于外部的设置,实际上是无法实现解耦的,因为你不知道引用的外部对象什么时候进行注入。此时,就该容器粉墨登场了, 我们需要一个地方统一管理系统中所有的依赖,这样容器诞生了。

容器负责两件事情:

  • 绑定服务与实例之间的关系
  • 获取实例,并对实例进行管理(创建与销毁)

最后,简单聊聊Spring框架的依赖注入。在Spring框架下,当Bean实例 A运行过程中需要引用另外一个Bean实例B时,Spring框架会创建Bean的实例B,并将实例B通过实例A的构造函数、set方法、自动装配和注解方式注入到实例A,这种注入实例Bean到另外一个实例Bean的过程称为依赖注入。

依赖注入是Spring协调不同Bean实例之间的合作而提供的一种工作机制,在确保Bean实例之间合作的同时,并能保持每个Bean的相对独立性,它包括一下几种方式:

● 理解基于构造函数的依赖注入

● 理解基于设置函数的依赖注入

● 基于自动装配的依赖注入

● 基于注解的依赖注入

滚动到顶部

免费制作创意短视频活动

复工复产之际,博视优学隆重推出免费制作视频活动——只需告诉我们您的视频需求,我们将免费为您制作一个创意短视频,用于您的营销推广或教学实践等。零成本试水短视频,开放名额有限,机不可失,不要犹豫!