Spring学习(一)Bean生命周期

Spring最重要的功能就是管理bean,所以bean的生命周期特别重要,分为四个大步骤:实例化,依赖注入,初始化,销毁
https://www.processon.com/view/link/5f8588c87d9c0806f27358c1

总结:

  1. InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()
  2. 实例化
  3. MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition()
  4. InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation()
  5. 自动注入
  6. InstantiationAwareBeanPostProcessor.postProcessProperties()
  7. Aware对象
  8. BeanPostProcessor.postProcessBeforeInitialization()
  9. 初始化
  10. BeanPostProcessor.postProcessAfterInitialization()

详细步骤以及解释
Spring配置文件分两种,一种是xml配置,一种是注解(Java代码)的配置
第一步:Spring 扫描(通过加载两种配置文件扫描)并且加载类定义(BeanDefinition),这个时候会生成一个 BeanDefinitionMap,并且判断扫描出来的类型中有没有实现 BeanPostProcessor,如果实现了,就需要实例化,并且放入List
第二步:通过 BeanDefinitionMap 获取对应的 BeanDefinition 判断 如果是 没有lazy标签,且为singleton单例模式,才会进行后续几步,然后通过类加载器加载成 class 对象
第三步:先判断当前class 是否实现了 InstantiationAwareBeanPostProcessor 接口,如果存在则执行实例化前,可以在实例化进行一些操作,如果该方法返回了一个对象,则不会进行后续步骤
第四步:推导构造方法,使用哪个构造方法进行实例化
第五步:实例化:对类进行实例化
第六步:先判断当前class 是否实现了 MergedBeanDefinitionPostProcessor 接口,如果存在则执行 BeanDefinition 的后置处理
第七步:这个时候会把实例化的对象放入到 BeanFactoryMap(三级缓存中)
第八步:先判断当前class 是否实现了 InstantiationAwareBeanPostProcessor 接口,如果存在则执行实例化后:实例化后对对象进行操作

依赖注入,这个时候会先去SingletonMap(一级缓存)中获取属性,如果没有则会去 earlySingletonMap(二级缓存)获取,如果没有则会去BeanFactoryMap(三级缓存)中获取BeanFactoty(半成品bean),然后调用early方法提前暴露的bean,如果这个提前暴露的bean存在aop,则会返回代理对象,并且存入earlySingletonMap(二级缓存)中,如果不需要aop,则直接返回 BeanFactoty(半成品bean)
第九步:自动注入
第十步:先判断当前class 是否实现了 InstantiationAwareBeanPostProcessor 接口,如果存在则执行 postProcessProperties ,这个方法处理 @Autowired、@Resource、@Value 这些注解

第十一步:如果对象实现了三种 aware接口,BeanNameAware, BeanClassLoaderAware,BeanFactoryAware,context则需要调用这些方法,将对应的值传入bean中
第十二步:初始化前:这里就是对扫描中拿到的 List for循环 调用 beforeBeanPostProcessor方法,这里初始化前有非常非常多的类都会实现,比较常用的功能就是InitDestroyAnnotationBeanPostProcessor实现的@PostConstruct注解,ApplicationContextAwareProcessor 中会调用 ApplicationContextAware,向对象中放入 ApplicationContext
第十三步:初始化:这里判断是否实现了InitializingBean接口,如果实现了,则会调用 afterPropertiesSet方法
第十四步:初始化后:这里就是对扫描中拿到的 List for循环 调用 afterBeanPostProcessor方法,最经典的就是在这里实现了AOP实现逻辑
在第十四步执行之后,会将实例化之后的singletonObject放入 singletonObjectMap(一级缓存) 中,IOC(控制反转,Spring自己控制bean)就是获取这些 bean
然后正常使用bean即可
第十五步:最后(初始化之后),有一个步骤会去判断当前创建的Bean是不是 DisposableBean(一些销毁逻辑) 如果是 这里会将bean适配成 disposableBean对象 存入 disposableBeans(LinkedHashMap) 中

第十六步:容器关闭,销毁bean,然后 for循环 disposableBeans 调用销毁方法 destroy 即可

posted @ 2024-07-26 22:51  寻找梦想的大熊  阅读(3)  评论(0编辑  收藏  举报