Spring系列(七)——Spring容器

一、Spring容器的概念
  1. Spring容器:主要是指IOC容器;也是Spring框架的核心技术,IOC容器主要的作用就是管理对象的创建及属性的赋值,及单例对象的销毁回收;SpringIOC容器管理对象的方式是DI(依赖注入)。
  2. SpringIOC的种类:Spring BeanFactory容器与Spring ApplicationContext容器
    • Spring BeanFactory容器: 最简单的容器,给DI提供了基本的支持。移动设备中为了节省有限的资源,会被优先选择,即主要用于轻量级应用。其用org.springframework.beans.factory.BeanFactory接口来定义。
    • Spring ApplicationContext容器: 在Spring BeanFactory容器的基础上,添加了更多企业特定的功能,比如后置通知,事件的监听等等...
二、常见的Spring ApplicationContext容器:

​ 在Spring中一般会有两种方式保存bean的定义信息,一种是Xml文件,另一种是注解形式(@Service、@Component、@Bean,@Repository...);所以开发中常见的两种容器:AnnotationConfigApplicationContext与ClassPathXmlApplicationContext;两者的区别在于,获取bean的定义的方式不同:

  • ClassPathXmlApplicationContext:是通过指定配置文件的路径去加载bean的定义信息,
  • AnnotationConfigApplicationContext:通过指定的配置类去扫描范围内的所有类,然后加载bean的是定义信息
三、 Spring容器的创建过程源码分析

下面案例以AnnotationConfigApplicationContext的创建为例

  1. 创建AnnotationConfigApplicationContext实例

  2. Spring容器的refresh()

  3. prepareRefresh():刷新容器前的预处理

    • AnnotationConfigApplicationContext.initPropertySources()
    • AbstractApplicationContext.prepareRefresh() (1)initPropertySources() :初始化属性设置;
      AnnotationConfigApplicationContext.initPropertySources()源码

      这是一个空实现,也就是说这个方法是初始化子类自定义的初始化内容
      (2)getEnvironment().validateRequiredProperties():检验属性是否合法
      (3)earlyApplicationEvents= new LinkedHashSet<ApplicationEvent>():该集合是保存一些容器早起的一些时间【ApplicationEvent在《Spring系列(六)——Spring扩展原理》中有过讲解】
  4. obtainFreshBeanFactory():获取BeanFactory
    (1)refreshBeanFactory();刷新BeanFactory;
    创建了一个this.beanFactory = new DefaultListableBeanFactory();设置id(源码如下)

    (2)getBeanFactory();返回刚才GenericApplicationContext创建的BeanFactory对象
    (3)返回BeanFactory;

  5. prepareBeanFactory(beanFactory):BeanFactory的预准备工作

  6. postProcessBeanFactory(beanFactory):该方法是一个空实现,留给子类通过重写这个方法来在BeanFactory创建并预准备完成以后做进一步扩展设置

  7. invokeBeanFactoryPostProcessors(beanFactory):执行BeanFactoryPostProcessor的方法 BeanFactoryPostProcessor是BeanFactory的后置处理器。执行时机是在该类初始化之后,更新应用容器中的bean工厂;此时所有bean的定义信息将被加载,但是却没有实例化的;后置通知设计到的接口:BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor;其中实现BeanDefinitionRegistryPostProcessor的bean的方法为什么会在实现BeanFactoryPostProcessor的bean的方法执行之前

    (1) PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors()):执行BeanFactoryPostProcessor的方法

  8. registerBeanPostProcessors(beanFactory):注册BeanPostProcessor(Bean的后置处理器)
    (1)不同的实现BeanPostProcessor子接口的Bean,在Bean创建前后的执行时机是不一样的;一下介绍
    BeanPostProcessor的子接口:DestructionAwareBeanPostProcessor、InstantiationAwareBeanPostProcessor、SmartInstantiationAwareBeanPostProcessor、 MergedBeanDefinitionPostProcessor
    (2)registerBeanPostProcessors(beanFactory)源码

    (3)PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this)源码

  9. initMessageSource();初始化MessageSource组件 (做国际化功能;消息绑定,消息解析)

  10. initApplicationEventMulticaster():初始化事件派发器

  11. onRefresh();是一个空实现,留给子容器重写这个方法,在容器刷新的时候可以自定义逻辑;

  12. registerListeners():给容器中将所有项目里面的ApplicationListener注册进来

  13. finishBeanFactoryInitialization(beanFactory);初始化所有剩下的单实例bean (特别重要)
    (1)源码展示

    (2)beanFactory.preInstantiateSingletons();初始化后剩下的单实例bean

  14. finishRefresh():完成BeanFactory的初始化创建工作;IOC容器就创建完成

转载于:https://my.oschina.net/ittzg/blog/3057557

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值