IoC/DI---入门

spring中两个重复重要的概念

 IoC——Inversion of Control,控制反转
        在Java开发中,IoC是将你设计好的类交给系统去控制,而不是在你的类内部控制。IoC是一种让服务消费者不直接依赖于服务提供者的组件设计方式,是一种减少类与类之间依赖的设计原则。

DI——Dependency Injection(依赖注入)
        即组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中。

如何理解上面的两个概念?

        控制反转:是谁控制了谁?哪些方面发生了反转?为什么需要反转?

        依赖注入:谁依赖谁?注入什么?

如何来回答上面的这些问题,那就从IOC/DI的演变过程来看。

       1、java基本阶段

      B类里面需要使用接口A,最原始的写法是: A a = new A1(); 或 A a = new A2(); 然后通过a来调用接口的方法。
对B来说是主动实例化对象,直接获取依赖。

        缺点:更换实现需要重新编译源代码,耦合性很强,很难更换实现。

        2、Factory阶段

        使用工厂模式—Factory,在 B类里面需要使用接口A,应用工厂模式的写法是: A     a = Factory.createA();然后通过a来调用接口的方法。对 B来说是被动实例化对象,间接获取依赖,但对工厂类来说是主动的。

        缺点:更换实现需要重新编译源代码,很难更换实现、难于测试。

        3、Factory + Xml + 反射 阶段

        工厂模式加配置文件—Factory+xml+反射,在B类里面需要使用接口A,应用工厂模式的写法是:
                             A a = Factory.createA();
        然后通过a来调用接口的方法。在工厂类里使用配置文件来决定要实例化的具体类。对C类说是被动创建对象,间接获取依赖,对工厂来说也是被动的。

        采用这种方式,当然比上面的要好多了,也是我们经常用的。但这种方式也存在相应的问题:如何实例化带参数的类,如
何在对调用的方法传递值等。

        4、IoC/DI阶段

        继续进化,就到了IoC/DI的层次,利用容器对IoC/DI涉及的元素进行整体控制,并提供更多更好的通用服务。此时在B类里面需要使用接口A,以Spring为例:
                        A a = BeanFactory.getBean(“XX”);
        然后通过a来调用接口的方法。此时由容器来创建对象和装配对象,并管理对象生命周期。对于应用程序
而言,就是被动实例化和被动接受依赖了。

        最后总结,对IOC容器及IOC的理解:

        IoC容器
        简单的理解就是:实现IoC思想,并提供对象创建、对象装配以及对象生命周期管理的软件就是IoC容器。

        IoC理解
        1、应用程序无需主动new对象;而是描述对象应该如何被创建即可,IoC容器帮你创建,即被动实例化;
        2、应用程序不需要主动装配对象之间的依赖关系,而是描述需要哪个服务IoC容器会帮你装配(即负责将它们关联在一起),被动接受装配;
        3、应用程序不知道依赖的具体实现,只知道需要提供某类服务的对象(面向接口编程)、并松散耦合;
        4、是一种让服务消费者不直接依赖于服务提供者的组件设计方式,是一种减少类与类之间依赖的设计原则。

猜你喜欢

转载自blog.csdn.net/qq_27052085/article/details/83826886