SpringBean+的生命周期
2025-08-03 12:37:40   0  举报             
     
         
 SpringBean的生命周期是指一个Bean从创建到销毁的整个过程,包括实例化、属性填充、初始化前的准备、初始化以及销毁前的清理。此过程中,核心内容包括:**依赖注入(DI)**,这发生在Bean的属性被填充时;**BeanNameAware和BeanFactoryAware**,这使Bean能够获得其标识和对Factory的引用;**初始化回调(如init-method)**,允许Bean执行如初始化数据库连接等所需的自定义操作;最后是**销毁回调(如destroy-method)**,用于执行清理资源,关闭数据库连接等。Spring容器管理Bean的创建和销毁,因此它确保只有在Bean完全初始化后才允许调用,而在Bean销毁前进行适当清理。  文件类型通常指的是配置文件(XML或Java配置),或是注解修饰语可能是“@PostConstruct”和“@PreDestroy”,这些用于标注Bean的初始化和销毁前后执行的方法。在Spring框架中,Bean的生命周期还可以通过实现特定接口(如InitializingBean和DisposableBean)进行更细致的控制。
    作者其他创作
 大纲/内容
 需要类型转换
  BeanClassLoaderAware.setBeanClassLoader()
  合并父子 BeangetMergedLocalBeanDefinition()
  AbstractAutowireCapableBeanFactory#doCreateBean
  构造器注入
  父子容器处理
  从缓存中获取包装对象
  拿到缓存
  其他else
  不需要
  getBean(String name)
  factory.getBean(\"user\")
  拿到了
  处理依赖 BeanregisterDependentBean()
  从父容器递归获取 Bean
  后面还要仔细研究
  BeanNameAware.setBeanName()
  转换名称transformedBeanName
  Set 注入
  第二阶段(属性填充 populateBean)
  初始化
  单例对象
  注册 DisposableBean
  AbstractBeanFactory#doGetBean
  创建包装对象createBeanInstance
  Spring 容器注入
  存在父容器&&当前容器不存在 Bean 定义
  检查是否需要提前曝光
  factory.getBean(\"user\
  避免循环依赖
  没拿到缓存
  BeanPostProcessor 加工
  从单例缓冲池获取getSingleton
  第三阶段(初始化 initializeBean)
  标记 Bean 为被创建alreadyCreated.add(beanName)
  需要
  BeanPostProcessor后置处理
  AbstractBeanFactory
  否
  InitializingBean.afterPropertiesSet()
  得到 Bean 对象
  *Aware.setXXX() ...
  ...
  实例化对象(反射)
  是
  BeanPostProcessor前置处理
  三级缓存机制1. singletonObjects:默认使用的缓存,存储完全初始化好的单例 Bean 实例2. earlySingletonObjects:用于存储尚未完全初始化的 Bean 实例3. singletonFactories:用于存储 bean 的工厂实例
  容器关闭
  结束
  第一阶段(创建实例 createBeanInstance )
  根据作用域创建 Bean
  获取 BeangetObjectForBeanInstance
  返回 Bean
  正常 Bean 直接返回如果是 FactoryBean 则返回 FactoryBean.getObject()
  属性填充
  init-method
  afterPropertiesSet
  1. 如果传入的 name 就是 ID,直接返回2. 如果传入的 name 是别名,转换 ID 返回3. 如果以 & 为前缀(获取 FactoryBean 类型),去掉 &,转换 ID 返回
  单例singleton
  再次检查是否存在循环依赖
  原型prototype
  DisposableBean.destroy()
  对象创建完毕可以使用
  destroy-method
  BeanFactoryAware.setBeanFactory()
  是否有缓存
  执行 MergedBeanDefinitionPostProcessor 后置处理器
   
 
 
 
 
  0 条评论
 下一页