Bean的生命周期
2025-02-26 14:53:14   5  举报             
     
         
 此图是我对SpringIoC源码的理解,供大家学习交流。 更多干货内容,欢迎关注我的公众号:Fox爱分享
    作者其他创作
 大纲/内容
 第6次调用后置处理器@Autowired 属性注入逻辑
  缓存中没有,调用业务factoryBean.getObject()生成的bean
  !bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()
    创建bean
  缓存单例bean到单例对象池
  beforeSingletonCreation(beanName)
  createAopProxy()代理方式的选择
  singletonObject = singletonFactory.getObject()
  object = getCachedObjectForFactoryBean(beanName)
  DisposableBeanAdapter#destroy
  singleton
  AbstractBeanFactory#getBean(String name)
  容器启动
  返回bean
  第5次调用后置处理器, 在属性填充逻辑前调用,可以忽略属性填充
  存在,判断FactoryBean类型
  afterSingletonCreation(beanName)
  setter方式反射完成依赖bean注入
  从factoryBeanObjectCache缓存中返回bean
  执行bean生命周期回调的init方法
  finishBeanFactoryInitialization(beanFactory)
  是否是FactoryBean类型 name的前缀是否是&
  destroySingleton(beanName)
  通过构造方法自动注入创建bean实例    clazz.newInstance(constructors)
  自定义初始化bean三种方式@PostConstruct        底层实现:InitDestroyAnnotationBeanPostProcessor#postProcessBeforeInitialization实现InitializingBean接口afterPropertiesSet()方法@Bean(initMethod=\"init\") 或者 xml中指定 init-method 
  beanFactory.getBean(beanName)
  返回factoryBean.getObject()生成的bean
  判断Scope类型
  第8次调用后置处理器 aop实现:AbstractAutoProxyCreator
  ctor.newInstance(args)
  prototype
  第三次后置处理器调用  允许后置处理器修改合并的bean定义AutowiredAnnotationBeanPostProcessor 解析@Autowired和@Value,封装到InjectionMetadata
  第2次调用后置处理器    获取@Autowired 修饰的构造器
  singletonObject = this.singletonObjects.get(beanName)
  sharedInstance = getSingleton(beanName)
  缓存当前beanName的单例工厂到singletonFactories
  调用singletonFactory.getObject()会执行此方法,返回未填充属性的bean第4次调用后置处理器  提前暴露bean的引用,主要用于解决循环依赖的问题
  创建proxy对象
  标记bean要被创建,添加到alreadyCreated中
  第九次调用后置处理器DestructionAwareBeanPostProcessor将bean注册为可以销毁
  缓存正在创建中的beanName列表,添加到singletonsCurrentlyInCreation
  createAopProxy().getProxy(classLoader)
  从单例对象池中获取
  从正在创建bean的列表中移除beanName
  filed属性反射完成依赖bean注入
  true
  合并BeanDefinition属性,返回RootBeanDefinition
  创建bean实例
  出现异常,执行销毁bean的逻辑
  AutowiredAnnotationBeanPostProcessor.AutowiredFieldElement#inject
  disposableBeans.remove(beanName)
  removeSingleton(beanName)
  AutowiredAnnotationBeanPostProcessor.AutowiredMethodElement.inject
  填充属性
  程序调用入口
  singletonObject = this.earlySingletonObjects.get(beanName)
  没有,构建bean
  转换对应的beanName,比如去除前缀&,转换别名
  AoP逻辑
  如果earlySingletonExposure为true,将早期的bean暴露出去,为true的条件:是否是单例bean && 允许循环依赖 && beanName存在于正在创建的beanName列表中
  初始化bean
  beanName = transformedBeanName(name)
  第七次后置处理器调用InitDestroyAnnotationBeanPostProcessor处理@PostConstruct注解ApplicationContextAwareProcessor调用Aware方法,ApplicationContextAware  EnvironmentAware ApplicationEventPublisherAware
  markBeanAsCreated(beanName)
  通过无参构造器创建bean实例   clazz.newInstance()
  new ObjenesisCglibAopProxy(config)
  context.getBean(\"user\")
  RootBeanDefinition  mbd = getMergedLocalBeanDefinition(beanName)
  实例化非懒加载的单例bean
  自定义销毁bean三种方式:@PreDestroy     底层实现:DestructionAwareBeanPostProcessor#postProcessBeforeDestruction实现DisposableBean接口destroy()方法@Bean(destroyMethod=\"destory\") 或者 xml中指定 destroy-method 
  bean实例化之前第一次后置处理器调用,可以直接返回任意Object对象
  !(beanInstance instanceof FactoryBean) || BeanFactoryUtils.isFactoryDereference(name)
  new JdkDynamicAopProxy(config)
  返回普通bean
  销毁bean前调用后置处理器  DestructionAwareBeanPostProcessor
  销毁bean,调用自定义销毁bean方法
  method.invoke 调用@Bean修饰的业务方法返回bean
  循环依赖核心判断逻辑,提前暴露未填充属性的bean完成属性填充
  refresh()
    
    收藏 
      
    收藏 
     
 
 
 
 
  0 条评论
 下一页
  
   
   
  
  
  
  
  
  
  
  
 