您的位置:首页 > 编程语言 > Java开发

Spring IOC之容器实现过程

2016-05-19 19:45 337 查看
     


第一章: Spring IoC实现过程

作为Spring的首要特性,首要目的是为了创建出一个产品,使它可以能作为一个具有魔法师角色的容器,管理所有容器中的Bean,同时又以一种面向接口,非侵入性地维持所有Bean之间的关系(即依赖注入)。

      这种技术的实现,首要的基础就是整个IOC容器接口设计关系,BeanFactory作为Spring最底层的一个IOC容器,只具备了对Bean管理的最基本的功能,getBean();ContainBean();isSigleleton();isPrototype();等方法的定义。而高级形态的的框架特性子接口扩展其他的接口来实现,如ApplicationContext容器,它是Spring中最实用的容器,首先是因为它的高级特性,因为,1、它实现了MessageSource接口,使得对国际化的支持;2、它实现了ResourceLoader,它采用策略模式,对不同来源的BeanDefinition提供支持,并产生一个Resource类,作为BeanDefinition在被载入时应用(后面介绍);3、实现ApplicationEventPublisher接口,使容器具有对一些事件的监听,和对一些方法,进行通知;等等高级特性。

       ListableFactory的一个实现类DafaultListabledBeanFactory是一个非常重要的一个实现容器,它具备了基础容器所具备的所有细化的功能,如果使用基本容器时,可以直接使用它通过编程的方式实现Bean的载入、注册和实例化;

        HirarchicalBeanFactory作为BeanFactory的一个字接口,它使得各个容器产生父子容器的关系,从而管理双亲IOC容器,因为只有子容器可以使用父容器的Bean,反之,则不可以。

举例说明使用基础容器,对BeanDefinition的载入,以XmlBeanFactory为例,加载XML形式的BeanDefinition。我们只需创建一个XmlBeanFactory容器类,继承DefaultListableBeanFactory类即可;在XmlBeanFactory类中创建XmlBeanDefinitionReader对象可读取一个Resource对象,Resource是对XML文件I/O操作的一个封装,通过Resource对象即可操作所要操作的Bean,因为基础IOC容器没有继承ResourceLoader,所以它没有一个智能读取不同文件的功能,我们可以采用Resource的具体实现类(如classPathResource)来获取Resource对象,或者自己编码采用ResourceLoader来读取Resource;(两种Resource的获取方式,后者即ApplicationContext实现ResourceLoader,本身便具有面向框架的特性)。这样便完成对BeanDefinition的读取工作,此时的BeanDefinition,是一种在Spring IOC容器中存在的数据结构;在BeanDefinition载入之后,还要在Spring中对它进行注册,即存放在一个可以由BeanName作为键能查找到对应BeanDefinition的HashMap中,在DefaultListAbleBeanFactory中有一个这样的Map,private final Map<String,BeanDefinition>  beanDefinition = new ConcurrentHasMap<String,BeanDefinition>();一个依靠Segment,支持多线程的CurrentHashMap来管理BeanDef
4000
inition。

       上面完成了对BeanDefinition的载入与注册,但这会还并不能对Bean进行使用,因为此时的Bean还未实例化,还未被修饰加工(后置处理器对实例化后的Bean要做一些处理),对Bean的实例化出发,是从执行getBean()方法开始的,这会开始Bean在Spring容器中的生命进程,直至容器关闭,Bean被销毁;在容器中的Bean依赖注入,是通过一个getBean()开始触发,然后根据BeanDefinition提供的信息,查找相关依赖类,递归进行Bean的实例化。

       在平常应用中,我们一般都采用ApplicationContext来对Bean进行管理,因为它通过不同的接口实现,具备很多好的特性,方便使用。首先它的一些Bean初始化,在容器启动时,便完成了初始化;还有后置处理器的使用,ApplicationContext可以通过Java反射机制自动读取配置中我们自己定义的后置处理器,并注入到上下文中,而BeanFactory需要手动编码配置。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: