• Spring 源码(1)Spring IOC Bean 创建的整体流程


    Spring IOC 中涉及的重要接口

    • BeanDefinition
      Bean的描述信息,实现类包括 RootBeanDefinitionGenericBeanDefinition,Bean的描述信息中定义了一系列Bean的信息,比如:beanClassNamescopelazyinitdependsOnprimaryinitMethodNamedestroyMethodNameisSingtonisAbstract等信息。

    • BeanDefinitionReader

      用于解析Bean的资源阅读器,比如针对于XML文件的配置的Bean,实现类XmlBeanDefinitionReader,针对properties文件的配置的Bean,实现类为PropertiesBeanDefinitionReaderSpring在启动时会将xml文件通过loadBeanDefinitions方法进行解析。

    • BeanFactory
      IOC容器实现的顶层接口,默认的实现为DefaultListableBeanFactorySpring Bean 的整个生命周期都是由DefaultListableBeanFactory去管理的,这个类非常的重要

    • BeanFactoryPostProcessor

      这个接口是BeanFactory的增强处理器,用于在Bean加载为BeanDefinition之后的扩展,比如实现类PlaceHolderConfigurerSupport 就是用来处理占位符解析的,当我在xml文件中配置jdbc信息的时候,通过是用${xxx.jdbUrl}这种方式配置数据库连接的时候,就是通过这个类来处理和解析的。

    • Aware

      这个接口,他下面有一堆的子接口,比如BeanNameAwareApplicationContextAwareBeanFactoryAwareEnvironmentAware等,可以通过实现这些接口完成ioc容器中特定信息的设置,比如EnvironmentAware,可以在Bean创建过程中设置环境信息到对应的Bean对象中,后期通过bean对象获取环境信息数据。

    • BeanPostProcessor

      这个接口是Bean的增强处理器,用于在Bean进行初始化时调用init-method方法的前后进行增强,他有两个方法:postProcessBeforeInitializationpostProcessAfterInitialization,分别用于bean初始化方法init-method之前和之后调用,当然还可以进行很多扩展,比如aop就是通过postProcessAfterInitialization方法中去创建动态代理对象。

    Spring Bean 的生命周期

    • 首先通过BeanDefinitionReader将xml中的Bean配置加载到BeanDefinition中
    • 然后将BeanDefinition放入DefaultListableBeanFacotry的beanDefinitionMap和beanDefinitionNames集合中
    • 然后调用BeanFactoryPostProcessor#postProcessorBeanFactory对容器中的BeanDefinition的属性进行增强解析
    • 然后通过反射调用对象的构造函数进行对象的实例化
    • 然后调用populateBean进行属性填充
    • 然后调用初始化方法initializeBean,初始化时又会先调用invokeAwareMethods方法执行一堆的Aware方法
    • 然后BeanPostProcessor#postProcessBeforeInitialization方法执行bean增强器的前置处理
    • 然后调用InitializingBean#afterPropertiesSet方法或者是调用自定义的init-method方法
    • 然后调用BeanPostProcessor#postProcessAfterInitialization方法执行bean增强的后置处理
    • 最后完成Bean的创建,最终放入一级缓存singletonObjects中

    整体流程大概就是这个,有了整体流程就可以进行下一步Bean创建的细节解读。

  • 相关阅读:
    便携烙铁开源系统IronOS,支持多款便携DC, QC, PD供电烙铁,支持所有智能烙铁标准功能
    通关GO语言14 内存分配:new 还是 make?什么情况下该用谁?
    进程管理--CFS调度器(1)
    hdlbits系列verilog解答(模块)-20
    20221116 Dubbo+Zookeeper
    互联网商业模式分享购买是什么?
    Flutter 项目实战 高德定位计算距离并展示首页数据 (六)
    模型压缩(一)通道剪枝-BN层
    二.maven常用功能点
    【SpringBoot教程】SpringBoot+MybatisPlus数据库连接测试 用户收货信息接口开发
  • 原文地址:https://www.cnblogs.com/redwinter/p/16141285.html