当前位置:首页 > 教程 > 控制反转(IoC)和依赖注入(Dependency Injection)实例分析讲解

控制反转(IoC)和依赖注入(Dependency Injection)实例分析讲解

当初在学习java的时候,经常看到IOC容器注入这个词,特别是在讲Spring框架的时候提到的最多,但是就是不明白控制反转(IoC)是什么意思,或者似懂非懂,总是模模糊糊的,经过多年的学习,然后回过头来总结,才逐渐明白控制反转(IoC)是什么意思。

控制反转(IOC)和依赖注入

一个概念首先从名字上最能说明他的意思。控制反转,可以分解就是“控制”+“反转”。控制指对对象的引用的控制,想象一下面向过程编程的时候,如果A对象要使用B(本文称之为资源对象),按照顺向思维应该怎么做呢,肯定是当A对象用到B的时候去创建B对象,这里是说A控制B,A对象是主动去获取B,这种情况称之为正向。现在是“反转”就是需要反过来,A对象不是主动去获取B,而是被动的等待,等待IOC的容器(你可以理解为提供被调用对象的框架,比如Spring)去获取B的一个实例,注入到A的对象中去,由于这个过程和原来的顺向过程刚好反过来了,所以称之为反向。

控制反转(IoC)有一个很形象的比喻称之为“好莱坞原则”,好莱坞原则是什么呢?不出名的演员想要演戏,然后就会去找导演啊,导演不认识你,你就死缠烂打,导演就说:“你不要打电话来了,我们会打给你的”,导演就说IOC的容器,演员就是A对象,它需要角色颜色,这里的角色就是导演(IOC容器)提供的。

什么是依赖注入(Dependency Injection)

说完了控制反转,在说说什么是依赖注入。有了控制反转的概念才有依赖注入。前面讲了,控制反转是需要需要IOC容器主动提供资源对象给调用者,怎么提供呢?当然是IOC容器给A对象注入,因为A对象依赖IOC容器,所以这种叫依赖注入。

依赖注入一般有3种方法:

  • 构造函数注入
  • 设置值注入
  • 接口注入

下面使用代码分析一下这三种注入方法。

构造函数注入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 public class A
    {
        private B b;
        public A(B b)
        {
            this.b = b;
        }
 
        public void MyBusiness()
        {
            b.DoSomething();
        }
    }
 
    public class B
    {
        public void DoSomething()
        {
 
        }
    }

如代码所示,B是通过参数传入A类中。

设置值注入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    public class A
    {
        private B b;
 
        public void SetB(B b)
        {
            this.b = b;
        }
 
        public void MyBusiness()
        {
            b.DoSomething();
        }
    }
 
    public class B
    {
        public void DoSomething()
        {
 
        }
    }

稍微修改了一下上面的代码,B是通过A的方法来设置的。

接口注入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    public interface IA
    {
        void CreateB(B b);
    }
 
    public class A:IA
    {
        private B b;
 
        public void CreateB(B b)
        {
            this.b = b;
        }
 
        public void MyBusiness()
        {
            b.DoSomething();
        }
    }
 
    public class B
    {
        public void DoSomething()
        {
 
        }
    }

如代码所示,IA这个接口抽象了创建B对象的方法,A实现接口IA就必须实现创建B的方法,这样也实现接口注入。

通过上面的讲解你应该明白所谓控制反转和依赖注入,参加的角色无非就是三个,对象A(资源调用者)、对象B(被调用的资源)、ioC容器(创建对象B并传入给A)。整体把握这个要点,那么控制反转(IOC)和依赖注入(ID)的整个精髓你就领悟到了。

  • << node.js 简介 — 年轻而又强大的服务器端...
  • jQuery Ajax 实现跨域名请求的方法 JSON... >>
  • 作者:
    除非注明,本文原创:知道91,欢迎转载!转载请以链接形式注明本文地址,谢谢。
    原文链接:http://www.zhidao91.com/ioc-di-introduce/

    相关文章 近期热评 最新文章

    • oracle数据库相关操作注意事项
      修改Oracle SGA(共享内存) 很多网站说修改Oracle的内存通过命令 如果你这么做了,那么恭喜你,你的Oracle数据库无法启动了。如果你已经这么做了,恢复Oracle启动的方...
    • 使用微信JDK实现微信接口签名验证
      要使用微信的接口必须在绑定的域名下测试;签名必须先向微信请求到access_token,然后用access_token再去请求jsapi_ticket,最后用jsapi_ticket和相关的参数按照ASCII码...
    • ABP开发指南系列教程(2) – 多层架构...
      为了减少复杂性和提高代码的可重用性,采用分层架构是一种被广泛接受的技术。为了实现分层的体系结构,ABP遵循DDD(领域驱动设计)的原则,将工程分为四个层: 展现层(...
    • ABP开发指南系列教程(1) – 入...
      ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称。 ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应用程序的新起点,它旨在成为一个通用的WE...
    • Windows下 JIRA + Agile + Mysql 破解...
      本文讲述了Windows下 JIRA + Agile + Mysql 破解安装示例教程
    • c#类的构造函数继承关系示例剖析
      本文通过示例代码讲解了c#子类的构造函数与父类的关系,子类怎样集成父类的构造函数的。