登录

angular.js - 如何通俗易懂的解释“依赖注入”?

如何通俗易懂的解释“依赖注入”?另外,依赖注入和控制反转有区别吗?具体是什么区别?

# AngularJS
ringa_leeringa_lee2112 天前579 次浏览

全部回复(7) 我要回复

  • 黄舟

    黄舟2017-05-15 17:06:27

    已经写好的东西 拿来即用!

    回复
    0
  • 世界只因有你

    世界只因有你2017-05-15 17:06:27

    首先 什么叫依赖? 一个对象依赖与其他对象 比如var d=new Date();就是d依赖于Date对象创建
    第二 依不依赖比较好?no 为了实现程序的低耦合,尽量减少各组件之间的相互依赖和制约比较好,比如一个构造函数,别人已经创建好了,我不用再创建就可以直接调用。
    第三 什么叫注入?意思我现在用的对象是别人给的,是被动创建的。比如

    angular.module('M1',['ng','ngRoute'])
    .controller('C1',function($scope,$http){
        $scope.data = 999;
        $http.get().success();    
    })
    这段代码运行时:只需要传入所需要的模块的名称,ng底层自动创建相关的对象,直接使用

    回复
    0
  • 阿神

    阿神2017-05-15 17:06:27

    没有区别,只是角度不同,所指的都是同一件事。简单来说,不需要你自己创对象,spring帮你将对象放到你需要的地方

    回复
    0
  • 滿天的星座

    滿天的星座2017-05-15 17:06:27

    都是工厂模式的升华罢了。
    依赖注入和控制反转代码原理时一回事,无非是理解上的不同而已。

    这些名词实在是太高级了,其实无非是面向对象的一些基础应用而已,把很多朋友糊弄住了。
    这与策略模式和工厂模式一个样。

    回复
    0
  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-05-15 17:06:27

    可以参考下:http://www.nowcoder.com/questionTerminal/3be16186465a453f876729acd2e46ddf

    回复
    0
  • 我想大声告诉你

    我想大声告诉你2017-05-15 17:06:27

    依赖注入和控制反转本质上没有区别, 只是对问题描述的角度不同。

    控制反转:
    到底是什么东西被反转了呢? 维基百科的定义是依赖对象的获得被反转了。
    应用程序一般都是由很多个对象组成的。一个类中需要用到很多其他的类,最初我们是自己主动通过new关键字获取其他类的实例。这样就带来一个问题:各个类的调用关系耦合了。

    有了控制反转之后, 我们只要被动地等待spring将类的实例注入给我们, 我们就可以直接使用了。

    这样有诸多好处, 对象集中管理, 不用自己实现很多单例, 解耦类的调用关系等等。

    假设有2个类 A和B, 如果A中使用了new B()这样的语句, 那就添加一条从B到A的有向边。庞大一点的工程可能拥有上千个类, 这样构成的有向图必定会异常复杂。如果用了控制反转, 在最极端的情况下, 我们所有的类都会变成独立的点。

    因为拥有了各个bean的控制权, 所以还能衍生出各种强大的功能。
    spring就是建立在IoC和AOP的基础上的。

    回复
    0
  • 迷茫

    迷茫2017-05-15 17:06:27

    有个数据库类db,它有一个静态方法get_db()能获取数据库连接对象.
    另外有一个需要操作数据库的类post,它有个方法get_post()需要查询数据库.
    因为数据库连接是公共操作,类post不想在自己内部又去连接一次数据库,避免耦合.
    所以post这个类内部提供了一个set_db()的方法来获取数据库连接对象.
    db::get_db()作为post类的set_db()这个方法的参数传到post类内部,这就是依赖注入.

    <?php
    class db {
        public static function get_db() {
            return new mysqli('127.0.0.1','user','pass','dbname',3306);
        }
    }
    class post {
        private $db;
        public function set_db($db){
            $this->db = $db;
        }
        public function get_post($id){
            return $this->db->query('SELECT * FROM post WHERE id ='.intval($id));
        }
    }
    $post = new post();
    $post->set_db( db::get_db() ); //注入post类依赖的数据库连接对象
    var_export( $post->get_post(1024) );

    对比下面的写法,可以体会下依赖注入其实是给完全OOP的某些语言打补丁.

    <?php
    function db() {
        static $db;
        if ($db) {
            return $db;
        } else {
            $db = new mysqli('127.0.0.1','user','pass','dbname',3306);
            return $db;
        }
    }
    function get_post($id) {
        $db = db();
        return $db->query('SELECT * FROM post WHERE id ='.intval($id))->fetch_all();
    }

    回复
    0
  • 取消回复发送