Spring学习---IoC原理及实现

    看到这篇文章的朋友,应该都对Spring有一定了解,或者有使用过Spring,那应该也听过Spring的两大核心就是IoC和AOP,这篇文章主要来讲解一下什么是IoC及其实现原理。

    IoC在平时的讨论中大多数只是一句“控制反转”,那么哪些方面的控制被反转了?这个问题的答案就是依赖对象的获得被反转了,也就是说对象的创建权被Spring容器管理了。

    那么这么做有什么好处呢?我们知道在传统的Java Web开发中,对象的获得是通过直接new对象的方式来获得的。

UserDaoImpl userDao = new UserDaoImpl();

   这样做导致了各个模块之间的耦合度很高,在需求变更时不易维护,通过控制反转这种方式大大降低了模块间的耦合性,增强了程序的健壮性,提高代码的可测试性。

    IoC作为Spring框架的核心思想,应用控制反转后,当对象被创建时,有一个调控系统内的所有对象的外界实体将其所依赖的对象引用传递给它,即依赖被注入到对象中,所以,控制反转是关于一个对象如何获取它所依赖的对象的引用,在这里,反转指的是责任反转。

    当然控制反转之后把责任交给了容器,下面我们就来了解一下Spring 的IoC容器。在Spring IoC容器中,主要有两个主要的容器系列,一个是实现了BeanFactory接口的简单容器系列,这个容器只是实现了容器的最基本功能;另一个是ApplicationContext 应用上下文,它作为容器的高级形态存在,在简单容器基础上增加了许多面向框架的特性。

    IoC容器的初始化步骤:

        BeanDefinition的定位

            BeanDefinition就是对控制反转模式中管理的对象关系的数据抽象,BeanDefinition抽象了我们对Bean的定义,也是实现控制反转的核心数据结构。

            对IoC容器来说,BeanDefinition的定位为管理POJO之间的依赖关系提供了帮助,我们可以使用各种形式的Bean定义信息,其中比较熟悉和常用的是使用XML的文件格式。Spring使用Resource接口来统一这些Bean定义信息,而这个定位由ResourceLoader来完成。

            如果使用基本的BeanFactory作为IoC容器,客户需要为BeanFactory指定相应的Resource完成Bean信息的定位;如果是上下文,ApplicationContext本身就是DefaultResourceLoader的子类,它本身就提供了定位的功能。

        BeanDefinition的载入和解析

            对IoC来说,这个过程相当于把定义的BeanDefinition在IoC容器中转化成一个Spring内部表示的数据结构的过程。

            一般BeanDefinition在IoC容器中通过一个ConcurrentHashMap来保持和维护。

        BeanDefinition在IoC容器中的注册

            在上面的过程完成后,用户定义的BeanDefinition已经在IoC容器中建立了自己的数据结构,但这些数据还不能共IoC直接使用,需要在容器中对这些BeanDefinition数据进行注册。

    IoC容器的依赖注入

        在容器初始化完成后,IoC容器的使用就准备好了,但这时只是在容器内部建立了BeanDefinition,具体的依赖关系还没有注入。在客户第一次向IoC容器请求Bean时,IoC容器对相关的Bean依赖关系进行注入。

        如果需要提前注入,客户可以通过lazy-init属性进行预实例化,这个预实例化是上下文初始化的部分,起到提前完成依赖注入的控制作用。

        这时可以通过getBean()方法来获取Bean,这些Bean不是简单的Java对象,而是包含了对象之间依赖关系的Bean。










猜你喜欢

转载自blog.csdn.net/Zhang_hongxin/article/details/81051521
今日推荐