getBean和后置处理器的9次干预
2023-06-25 16:52:16   0  举报             
     
         
 在Spring框架中,getBean方法是一个非常重要的环节。它负责从容器中获取指定名称的bean实例。然而,这个过程并不简单,因为在实际应用中,我们通常会使用后置处理器对bean进行一些额外的处理。这些后置处理器可以在bean创建、初始化、销毁等阶段对其进行干预。在一次典型的getBean调用中,可能会涉及到9次后置处理器的干预,包括:前置处理器1-5、初始化后置处理器1-3以及销毁后置处理器1-2。这些处理器共同协作,确保bean在整个生命周期中都能得到适当的处理,从而提高应用程序的稳定性和可维护性。
    作者其他创作
 大纲/内容
 是
  是否创建了代理对象
  bean创建完成后
  getSingleton(beanName)
  我们自己返回
  InitializingBean#afterPropertiesSet();//属性设置完后做事
  有
  applyBeanPostProcessorsAfterInitialization
  进入一下bean实例化流程
  有没有依赖的组件
  第八次调用后置处理器,Spring内置后置处理器中,只有ApplicationListenerDetector有处理逻辑,ApplicationListenerDetector会将实现了ApplicationListener接口的bean添加到事件监听器列表中
  决定使用构造器
  典型代表
  封装了当前bean的所有属性名和值,可以由后置处理器处理得到
  font color=\"#323232\
  SmartInstantiationAwareBeanPostProcessor#getEarlyBeanReference第四次,在getEarlyBeanReference中,使用beanPostProcessor对早期bean进行处理,如在AOP中生成代理对象
  拿好创建好的对象
  createBean()//结束
  是否获取到bean
  构造器方式自动装配创建bean
  对象创建成功
  ApplicationContextAwareProcessor注入
  // 拿到整个beanFactory的父工厂;看父工厂没有,从父工厂先尝试获取组件;   BeanFactory parentBeanFactory = getParentBeanFactory();
  createBean()//开始创建bean
  创建bean的实例使用beanwapper
  获取当前bean依赖的所有组件
  结束直接返回
  否
  doCreateBean()//Spring真正自己创建对象
  单实例'、非抽象、非懒加载
  否,普通类名
  返回null
  返回的是wrappedBean可以改变之前创建好的bean
  从这个池子singletonsCurrentlyInCreation移除
  getBean(beanName)
  第一次调用bean后置处理器,调用beanPostProcessor的applyBeanPostProcessorsBeforeInstantiation方法,在bean实例化之前的进行处理, Spring内置的后置处理器中,无相关实现,可使用自定义的后置处理器在这里进行中止bean的创建过程操作
  第二次 决定使用哪个处理器
  Bean初始化流程-getBean()的详细逻辑
  getBean(FACTORY_BEAN_PREFIX + beanName)
  InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation()//初始化之后进行处理
  使用默认无参构造器
  设置属性Spring把PropertyValues中所有的属性值进行反射赋值
  第九次调用后置处理器,判断bean是否有销毁方法(取出第四次调用后置处理器时解析的@PreDestroy方法)有则将bean注册到销毁集合中,用于容器关闭时使用
  是,名字加&
  遍历获取所有Bean进行创建获取
  直接用
  遍历所有bean执行SmartInitializingSingleton.afterSingletonsInstantiated()
  工厂bean的流程
  InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()给一个创建代理对象的机会
  第一次会返回null
  第七次调用后置处理器,ImportAwareBeanPostProcessor处理ImportAware接口,InitDestroyAnnotationBeanPostProcessor处理@PostContrust注解,ApplicationContextAwareProcessor处理一系列Aware接口的回调方法
  是否工厂bean
  返回PropertyValues
  可以当前组件所有属性全部就绪后继续进行增强
  SmartInstantiationAwareBeanPostProcessor.determineCandidateConstructors()//后置处理器有机会决定当前bean使用哪个构造器
  applyBeanPostProcessorsBeforeInitialization
  看父工厂有没有这个组件
  doGetBean
  对象创建
  wrapper(功能增强)holder(只用来包装)
  第三次,将标识了需要自动装配注解的属性或方法解析出来,包含的注解主要有 @Resource @Autowired @Value @Inject @PostConstruct @PreDestroy
  afterSingletonCreation(beanName);//移除当前创建对象池子
  InstantiationAwareBeanPostProcessor.postProcessProperties()//处理属性值
   
 
 
 
 
  0 条评论
 下一页
  
   
   
   
   
  
  
  
  
  
  
  
  
 