spring IOC

spring是一个框架,所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。

Spring中提供了两种IoC容器:

  • BeanFactory
  • ApplicationContext

 我们可以看到,ApplicationContextBeanFactory的子类,所以,ApplicationContext可以看做更强大的BeanFactory,他们两个之间的区别如下:

  • BeanFactory。基础类型IoC容器,提供完整的IoC服务支持。如果没有特殊指定,默认采用延迟初始化策略(lazy-load)。只有当客户端对象,需要访问容器中的某个受管对象的时候,才对该受管对象进行初始化以及依赖注入操作。所以,相对来说,容器启动初期速度较快,所需要的资源有限。对于资源有限,并且功能要求不是很严格的场景,BeanFactory是比较合适的IoC容器选择。
  • ApplicationContextApplicationContextBeanFactory的基础上构建,是相对比较高级的容器实现,除了拥有BeanFactory的所有支持,ApplicationContext还提供了其他高级特性,比如事件发布、国际化信息支持等,ApplicationContext所管理的对象,在该类型容器启动之后,默认全部初始化并绑定完成。所以,相对于BeanFactory来说,ApplicationContext要求更多的系统资源,同时,因为在启动时就完成所有初始化,容器启动时间较之BeanFactory也会长一些。在那些系统资源充足,并且要求更多功能的场景中,ApplicationContext类型的容器是比较合适的选择。

        但是我们无论使用哪个容器,我们都需要通过某种方法告诉容器关于对象依赖的信息,只有这样,容器才能合理的创造出对象,否则,容器自己也不知道哪个对象依赖哪个对象

可以通过以下来告诉spring容器内对象的依赖关系:

  • 通过最基本的文本文件来记录被注入对象和其依赖对象之间的对应关系
  • 通过描述性较强的XML文件格式来记录对应信息
  • 通过编写代码的方式来注册这些对应信息
  • 通过注解方式来注册这些对应信息

虽然提供了四种方式,但是我们一般只使用xml文件方式和注解方式,所以,就重点讲解这两种方式。

加载配置文件信息

        1、我们已经知道我们主要通过xml文件和注解的方式来告诉容器对象间的依赖信息,那么容器怎么才能从xml配置文件中得到对象依赖的信息呢?

        2、在BeanFactory容器中,每一个注入对象都对应一个BeanDefinition实例对象,该实例对象负责保存注入对象的所有必要信息,包括其对应的对象的class类型、是否是抽象类、构造方法参数以及其他属性等。当客户端向BeanFactory请求相应对象的时候,BeanFactory会通过这些信息为客户端返回一个完备可用的对象实例。

       3、 那么BeanDefinition实例对象的信息是从哪而来呢?这里就要引出一个专门加载解析配置文件的类了,他就是BeanDefinitionReader,对应到xml配置文件,就是他的子类XmlBeanDefinitionReaderXmlBeanDefinitionReader负责读取Spring指定格式的XML配置文件并解析,之后将解析后的文件内容映射到相应的BeanDefinition

        在我们了解了怎么得到对象依赖的信息,并知道这些信息最终保存在BeanDefinition之后,我们可能会想,那么容器怎么通过这些信息创造出一个可用的对象了呢?

容器中对象的创建和获取

        容器创造一个对象的过程称为Bean的注册,实现Bean的注册的接口为BeanDefinitionRegistry,其实BeanFactory只是一个接口,他定义了如何获取容器内对象的方法,我们所说的BeanFactory容器,其实是这个接口的实现类,但是具体的BeanFactory实现类同时也会实现BeanDefinitionRegistry接口,这样我们才能通过容器注册对象和获取对象。

我们通过BeanDefinitionRegistryrsgisterBeanDefinition(BeanDefinition beandefinition)方法来进行Bean的注册

              总结一下一个Bean是如何注册到容器中,然后被我们获取的:
首先我们需要配置该Bean的依赖信息,通常我们配置在xml文件中,然后我们通过XmlBeanDefinitionReader读取文件内容,然后将文件内容映射到相应的BeanDefinition,然后我们可以通过BeanFactoryBeanDefinitionRegistry的具体实现类,比如DefaultListableBeanFactory实现Bean的注册和获取

参考spring ioc系列文章:细说Spring——IoC详解(IoC概览) - 简书

细说Spring——IoC详解(深入IoC实现) - 简书

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值