【Spring】bean的创建生命周期
创始人
2024-02-21 02:05:18
0

【Spring】bean的创建生命周期

Bean创建生命周期流程

  1. 启动ApplicationContext
  2. 创建BeanFactory
  3. 初始化BeanFactory
  4. 执行BeanFactory后置处理器
  5. Spring扫描
  6. 生成BeanDefinition
  7. 合并BeanDefinition
  8. 加载类
  9. 实例化前
  10. 推断构造方法
  11. 实例化
  12. BeanDefinition的后置处理
  13. 实例化后
  14. 填充属性
  15. 填充属性后
  16. 执行Aware
  17. 初始化前
  18. 初始化
  19. 初始化后

启动ApplicationContext

创建BeanFactory

初始化BeanFactory

执行BeanFactory后置处理器

Spring扫描

Spring启动的时候会进行扫描,会先调用org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#scanCandid

ateComponents(String basePackage) 扫描某个包的路径,并得到BeanDefinition的Set集合。

  1. 首先,通过ResourcePatternResolver获取指定包路径下的所有.class文件。
  2. 遍历每个Resource对象
  3. 利用MetadataReaderFactory解析Resource对象得到MetadataReader
  4. 利用MetadataReader进行excludeFilters和includeFilters,以及条件注解@Conditional的筛选
  5. 筛选通过后,基于metadataReader判断排除对应的类是不是接口或者抽象类,
  6. 如果筛选通过,那么就表示扫描到一个Bean,将ScannedGenericBeanDefinition加入结果集。

MetadataReader表示类的元数据读取器。主要包含一个AnnotationMetadata。功能有

  1. 获取类的名字
  2. 获取父类的名字
  3. 获取所实现的所有接口名字
  4. 获取所有内部类的名字
  5. 判断是不是抽象类
  6. 判断是不是接口
  7. 判断是不是一个注解
  8. 获取拥有某个注解的方法集合
  9. 获取类上添加的所有注解信息
  10. 获取类上添加的所有注解类型集合

生成BeanDefinition

合并BeanDefinition

加载类

  1. 优先返回当前线程中的ClassLoader
  2. 线程中类加载器为null的情况下,返回ClassUtils类的类加载器
  3. 如果ClassUtils类的加载器为空,那么则表示是Bootstrap类加载器加载的ClassUtils类,那么则返回系统类加载器。

实例化前

在Spring中,实例化对象之前,Spring提供了一个扩展点,允许用户来控制是否在某个或某些Bean实例化前做一些启动动作。这个扩展点叫InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()

推断构造方法

实例化

根据BeanDefinition创建一个对象

BeanDefinition的后置处理

Bean对象实例化出来之后,接下来就应该给对象的属性赋值。在真正给属性赋值之前,Spring又提供了一个扩展点MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition(),可以对此时的BeanDefinition进行加工。

实例化后

在处理完BeanDefinition后,Spring又设计了一个扩展点InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation()

填充属性

填充属性后

执行Aware

完成了属性赋值后,Spring会执行一些回调。包括:

  1. BeanNameAware:回传beanName给bean对象
  2. BeanClassLoaderAware:回传classLoader给bean对象
  3. BeanFactoryAware:回传BeanFactory给对象

初始化前

初始化前,Spring提供了一个扩展点:BeanPostProcessor.postProcessBeforeInitialization()

初始化

查看当前Bean对象是否实现了InitializingBean接口,如果实现了就调用其afterPropertiesSet()方法

执行BeanDefinition中指定的初始化方法

初始化后

Bean创建生命周期中的最后一个步骤,也是Spring提供的一个扩展点:BeanPostProcessor.postProcessAfterInitialization()

相关内容

热门资讯

纳思达7月22日获融资买入23... 7月22日,纳思达跌1.67%,成交额2.71亿元。两融数据显示,当日纳思达获融资买入额2390.0...
宝武镁业7月22日获融资买入5... 7月22日,宝武镁业涨1.96%,成交额3.66亿元。两融数据显示,当日宝武镁业获融资买入额5753...
融捷股份7月22日获融资买入9... 7月22日,融捷股份涨1.12%,成交额6.08亿元。两融数据显示,当日融捷股份获融资买入额9740...
海利得7月22日获融资买入21... 7月22日,海利得涨1.23%,成交额2.59亿元。两融数据显示,当日海利得获融资买入额2168.2...
飞马国际7月22日获融资买入3... 7月22日,飞马国际涨1.38%,成交额4.25亿元。两融数据显示,当日飞马国际获融资买入额3003...
鱼跃医疗7月22日获融资买入2... 7月22日,鱼跃医疗涨0.09%,成交额3.60亿元。两融数据显示,当日鱼跃医疗获融资买入额2602...
7月22日中证A500指数ET... 7月22日,中证A500指数ETF(159357)涨0.85%,成交额7448.96万元。当日份额减...
7月22日央企ESGETF(5... 7月22日,央企ESGETF(560810)涨1.87%,成交额620.01万元。当日份额减少500...
清华才俊汇聚抗日根据地!带来这... 转自:北京日报客户端今年是中国人民抗日战争暨世界反法西斯战争胜利80周年,《纪事书场》撷取《纪事》抗...
壶化股份:已设立墨脱分公司,跟... 壶化股份7月23日在互动平台上表示,目前公司炸药产能为11.4万吨,其中混装炸药产能4万吨。未来公司...