Bean的加载

Bean加载的总体过程

  1. 转换对应的beanName
  2. 尝试从缓存中加载单例: Spring中的Bean默认是单例的,因此在同一个容器内只会被创建一次,后续再获取Bean就直接从单例缓存中获取。如果尝试从缓存中加载失败,则会再次尝试从SingletonFactories中加载。因为在创建单例Bean的时候存在依赖注入的情况,而在创建依赖Bean的时候为了避免循环依赖,Spring不等Bean创建完成就会将创建Bean的ObejectFactory提早曝光加入到缓存中,当下一个Bean创建时需要依赖上一个Bean则直接使用ObjectFactory去生产Bean
  3. Bean的实例化: 如果从缓存中得到了bean的原始状态,则需要对bean进行实例化缓存中记录的只是最原始的bean状态
  4. 原型模式的依赖检测:只有在单例情况下才会尝试解决循环依赖
  5. 检测parentBeanFactory:如果缓存中没有直接到父类上进行加载
  6. 寻找依赖: 在初始化某一个bean的时候首先会初始化这个bean所对应的依赖
  7. 针对不同的scope进行bean的创建: Spring中默认时singleton,因此需要根据不同的配置使用不同的策略进行初始化
  8. 类型转换

FactoryBean的使用

​ Spring通过反射机制利用bean的class属性指定实现类来实例化bean,某些情况下,实例化bean的过程比较复杂,因此如果实现了Factory接口就可以通过该接口定制实例化Bean的逻辑

FactoryBean接口的三个方法

  • T getObject() :返回由FactoryBean创建的bean实例,如果isSingleton()返回true,则会将该实例放到Spring容器的单例缓冲池中
  • boolean isSingleton():返回由FactoryBean创建的bean实例的作用域如果是Singleton就返回true
  • Class getObjectType():返回FactoryBean创建的bean类型

缓存中获取单例Bean

​ 单例Bean在Spring的同一个容器内只会创建一次,后续在获取bean直接从单例缓存中获取,如果缓存中没有就会尝试从earlySingletonObjects中获取,如果获取不到在到singletonFactories中加载,然后将ObjectFactory生产的Bean放到earlySingletonObjects中。这样做的目的是避免循环依赖。Spring创建Bean的原则是不等bean创建完成就会将创建bean的ObjectFactory提早曝光加入到缓存中,一旦下一个bean创建时,需要依赖上一个bean,则直接使用这个Bean工厂去生产