Spring IOC加载过程(一)

**引言:**网络上有很多关于Spring IOC的加载流程,说的都比较细致,但是有些时候不是越细致越好,太细致了,容易让人疲劳而且给人一种云里雾里的感觉,看了几遍也不能记住或者干脆是看了后面忘了前面。因此本人从整体脉络入手,梳理下Spring IOC的相关流程,如有问题,敬请指正。

IOC整体流程

Spring IOC是什么?

  Spring IOC说白了就是一个容器,这里面保存了你所需要的Spring Bean的信息,那么IOC流程是什么呢?就是如何把你配置的信息转成Spring Bean实例的过程。
  上图其实就是SpringBean生成的一些关键步骤,其中的一些前置处理器和后置处理器包括一些初始化容器信息都给省略了,以后的文章中我会慢慢的讲述。
  本篇呢,就是一个开篇之作,让你对Spring IOC的整体流程有个印象,以后慢慢丰富,这个就是Spring IOC加载流程的骨骼脉络,起支撑作用。

Spring Bean配置信息

  我们知道,Spring经过发展,对Bean的配置管理经过了xml、javaconfig以及SpringBoot的自动装配(其实也是基于javaconfig技术)的发展历程。
  在xml时代,我们通过标签配置我们需要使用的Bean,比如<bean class="xxx.xxx.xx" lazy="true" initMethod="xxxx"></bean>等,在这里面,我们可以很清晰的看到这个bean的一些配置信息(是否懒加载啊、初始化执行哪个方法啊、实例化的是哪个类啊),那么怎么把这个配置信息转成程序里面可用的实例呢?这个就是有Spring IOC来完成的。
  从图中我们能看出来Spring IOC把配置信息实例化大致是通过两步来完成的,首先是读取配置信息生成BeanDefinition,然后把BeanDefinition信息交由BeanFactory来生产出我们所需要的Bean。当然这里还有一些其它的操作点,比如我们可以在生成BeanDefinition后修改BeanDefinition信息、或者是在生成BeanDefinition过程中我们注册新的Bean的BeanDefinition信息。也可以在生成Bean的过程中(之前、之后)对Bean的信息进行修改,这些都是Spring留下的扩展点,在图中,我用了扩展1、扩展2、扩展3进行了代替。以后再进行说明这些扩展信息。目前不影响主要流程。
  Spring 加载配置信息的主要手段目前有两种,xml和javaconfig,目前主流是javaconfig(注解方式),xml和javaconfig读取配置主要分别有ClassPathXmlApplicationContext和AnnotationConfigApplicationContext来加载和解析配置,然后生成再对BeanDefinition进行注册,之后交由BeanFactory进行实例化。

Spring Bean实例化

  BeanFactory获取到BeanDefinition后,通过反射或者FactoryBean的方式对对象进行实例化,在实例化的过程中会出现循环引用(A对象的属性引用B对象,B对象的属性引用了A对象)的问题。我们也可以在实例化过程中,通过调用Spring定义好的一系列的aware对象,对让Bean在实例化过程中完成一些初始化操作(@Autowared和@Value就发生在这一步骤当中)。我们也可以通过Spring给的扩展点BeanPostProcesser来修正我们Bean的实例化过程。也可以通过Spring给的扩展点BeanFactoryPostProcesser来修改BeanDefinition的相关信息。这是两个比较重要的扩展点,在Spring集成一些其它框架的时候,多使用BeanFactoryPostProcesser来扩展程序。

总结

   Spring IOC主要是两步骤完成Bean实例化:

   1. 读取配置信息生成BeanDefinition;
   2. 使用BeanDefinition通过BeanFactory来成产Bean;
   在生成BeanDefinition时,允许通过扩展点BeanFactoryPostProcesser来修改或者新增BeanDefinition信息。
   在Bean实例化时,允许通过扩展点BeanPostProcesser来阻止或者修改Bean的生成信息,也可通过实现一系列的aware的接口,使在生成Bean实例后,调用我们自己类实现的初始化方法或者获取一些环境信息和Spring 上下文信息。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值