37.SpringIoC之Bean生命周期源码解析

Spring最重要的功能就是帮助程序员创建对象(也就是IOC)

在Spring中,一个Bean是如何生成的,如何销毁的

Bean的生成过程

生成BeanDefinition

Spring启动的时候会进行扫描,会先调用org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#scanCandidateComponents(String basePackage) 扫描某个包路径,并得到BeanDefinition的Set集合。

Spring扫描流程

//org.springframework.context.annotation.ClassPathBeanDefinitionScanner#doScan  
// DefaultListableBeanFactory
//生成beanName org.springframework.context.annotation.AnnotationBeanNameGenerator#generateBeanName

//默认值赋值 postProcessBeanDefinition
//解析属性注解赋值 AnnotationConfigUtils.processCommonDefinitionAnnotations
//BeanDefinition 包装成 BeanDefinitionHolder
//把BeanDefinitionHolder 注册到 beanDefinitionMap
//org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#findCandidateComponents

//生成非懒加载的单例bean
//org.springframework.context.support.AbstractApplicationContext#finishBeanFactoryInitialization
//org.springframework.beans.factory.config.ConfigurableListableBeanFactory#preInstantiateSingletons

//通过 beanName 查找 RootBeanDefinition
//mergedBeanDefinitions
//org.springframework.beans.factory.support.AbstractBeanFactory#getMergedBeanDefinition

//创建完所有的单例bean后,调用每个单例bean的SmartInitializingSingleton.afterSingletonsInstantiated
  • 通过ResourcePatternResolver获得指定包路径下的所有.class文件(Spring源码中将此文件包装成了Resource对象
    • 可以指定配置文件,仅扫描配置文件里的对象
  • 遍历每个Resource对象
    • 利用MetadataReaderFactory解析Resource对象得到MetadataReader
    • 利用MetadataReader进行excludeFilters和includeFilters,以及条件注解@Conditional的筛选
    • 筛选通过后,基于metadataReader生成ScannedGenericBeanDefinition
    • 基于metadataReader判断是不是对应的类是不是接口或抽象类
    • 将ScannedGenericBeanDefinition加入结果集

合并BeanDefinition

加载类

实例化前

实例化

BeanDefinition的后置处理

实例化后

自动注入

处理属性

执行Aware

初始化前

初始化

初始化后

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值