BeanFactory是spring的IOC中心容器,前面咱们讲了spring发动扫描事务类并封装成BeanDefinition,BeanDefinition就存储在bean工厂中,本文咱们详细解说BeanFactory宗族。

承继联系

首先祭出BeanFactory宗族承继联系图:

6.AliasRegistry和BeanFactory

咱们对以上一切类做个详细的源码分析:

AliasRegistry接口

AliasRegistry。用于办理别号的公共接口,定义对别号的简略增删等操作。用作超级接口。

public interface AliasRegistry {
  /**
   * 注册表中给name注册一个别号alias
   */
  void registerAlias(String name, String alias);
  /**
   * 移除注册表中的别号alias
   */
  void removeAlias(String alias);
  /**
   * 校验注册表中是否存在别号name
   */
  boolean isAlias(String name);
  /**
   * 在注册表中获取给定的一切别号信息
   */
  String[] getAliases(String name);
}

BeanDefinitionRegistry接口:承继了AliasRegistry

BeanDefinitionRegistry。BeanDefinition的注册表接口,使BeanDefinition的注册表接口具有别号办理的功用。

public interface BeanDefinitionRegistry extends AliasRegistry {
  /**
   * 注册BeanDefinition到注册表
   */
  void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
      throws BeanDefinitionStoreException;
  /**
   * 移除注册表中beanName的BeanDefinition
   */
  void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
  /**
   * 获取注册表中beanName的BeanDefinition
   */
  BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
  /**
   * 查看此注册表是否包括具有给定称号的BeanDefinitio。
   */
  boolean containsBeanDefinition(String beanName);
  /**
   * 回来此注册表中定义的一切bean的称号。
   */
  String[] getBeanDefinitionNames();
  /**
   * 回来注册表中定义的bean的数目
   */
  int getBeanDefinitionCount();
  /**
   * 确定给定bean称号是否已在该注册表中运用
   */
  boolean isBeanNameInUse(String beanName);
}

SimpleAliasRegistry:AliasRegistry完成类

SimpleAliasRegistry。AliasRegistry接口的完成类。完成别号操作,内部运用ConcurrentHashMap作为内存注册表,存储name-alias的映射联系。

public class SimpleAliasRegistry implements AliasRegistry {
​
  //别号-标准称号的映射MAP,用于存储注册信息(内存注册表)
  private final Map<String, String> aliasMap = new ConcurrentHashMap<>(16);
​
​
  //注册表中注册别号
  @Override
  public void registerAlias(String name, String alias) {
    //锁注册表
    //由于CurrentHashMap只有put和remove是线程安全
    //此处要包装对CurrentHashMap的复合操作线程安全
    synchronized (this.aliasMap) {
      //判别别号与标准称号是否相同
      if (alias.equals(name)) {
        // 相一起,在注册表移除当时别号信息
        this.aliasMap.remove(alias);
       }
      else {
        //获取当时别号在注册表中的标准称号
        String registeredName = this.aliasMap.get(alias);
        
        if (registeredName != null) {
          //标准称号存在,不需求注册,回来
          if (registeredName.equals(name)) {
            return;
           }
          //判别是否答应重写注册
          if (!allowAliasOverriding()) {
            throw new IllegalStateException("Cannot define alias '" + alias + "' for name '" +
                name + "': It is already registered for name '" + registeredName + "'.");
           }
         }
        // 校验标准称号是否指向当时别号的
        checkForAliasCircle(name, alias);
        // 注册表注册别号与标准称号的映射
        this.aliasMap.put(alias, name);
       }
     }
   }
​
  /**
   * 是否答应重写注册表别号信息,默许true
   */
  protected boolean allowAliasOverriding() {
    return true;
   }
​
  /**
   * 校验给定的name-alias映射是否已在注册表aliasMap中
   */
  public boolean hasAlias(String name, String alias) {
    //遍历注册表
    for (Map.Entry<String, String> entry : this.aliasMap.entrySet()) {
      //注册表中单映射的标准称号name
      String registeredName = entry.getValue();
      //判别name是否与传入name共同
      if (registeredName.equals(name)) {
        //获取注册表单项的别号
        String registeredAlias = entry.getKey();
        
        // hasAlias(registeredAlias, alias)) 检测是否存在循环引证
        
        // 循环引证如下 
        // 注册表: A-B; C-A;D-C
        // B对应的别号有ACD
        // A对应的别号别号CD
        // C对应的别号有D
        // 是循环引证 此处需求校验
        return (registeredAlias.equals(alias) || hasAlias(registeredAlias, alias));
       }
     }
    return false;
   }
​
  /**
   * 移除别号,在注册表aliasMap中
   */
  @Override
  public void removeAlias(String alias) {
    synchronized (this.aliasMap) {
      //移除别号,并判别是否移除成功
      String name = this.aliasMap.remove(alias);
      if (name == null) {
        throw new IllegalStateException("No alias '" + alias + "' registered");
       }
     }
   }
​
  /**
   * 校验是否包括给定的别号,在注册表中
   */
  @Override
  public boolean isAlias(String name) {
    return this.aliasMap.containsKey(name);
   }
  
  /**
   * 在注册表获取给定标准称号的一切别号信息
   */
  @Override
  public String[] getAliases(String name) {
    List<String> result = new ArrayList<>();
    synchronized (this.aliasMap) {
      retrieveAliases(name, result);
     }
    return StringUtils.toStringArray(result);
   }
​
  /**
   * 
   */
  private void retrieveAliases(String name, List<String> result) {
    this.aliasMap.forEach((alias, registeredName) -> {
      //判别当时别号的标准称号是否为要查询的
      if (registeredName.equals(name)) {
        result.add(alias);
        //递归查询循环引证的别号
        retrieveAliases(alias, result);
       }
     });
   }
​
  /**
   *
   */
  public void resolveAliases(StringValueResolver valueResolver) {
    Assert.notNull(valueResolver, "StringValueResolver must not be null");
    synchronized (this.aliasMap) {
      Map<String, String> aliasCopy = new HashMap<>(this.aliasMap);
      aliasCopy.forEach((alias, registeredName) -> {
        String resolvedAlias = valueResolver.resolveStringValue(alias);
        String resolvedName = valueResolver.resolveStringValue(registeredName);
        if (resolvedAlias == null || resolvedName == null || resolvedAlias.equals(resolvedName)) {
          this.aliasMap.remove(alias);
         }
        else if (!resolvedAlias.equals(alias)) {
          String existingName = this.aliasMap.get(resolvedAlias);
          if (existingName != null) {
            if (existingName.equals(resolvedName)) {
              // Pointing to existing alias - just remove placeholder
              this.aliasMap.remove(alias);
              return;
             }
            throw new IllegalStateException(
                "Cannot register resolved alias '" + resolvedAlias + "' (original: '" + alias +
                "') for name '" + resolvedName + "': It is already registered for name '" +
                registeredName + "'.");
           }
          checkForAliasCircle(resolvedName, resolvedAlias);
          this.aliasMap.remove(alias);
          this.aliasMap.put(resolvedAlias, resolvedName);
         }
        else if (!registeredName.equals(resolvedName)) {
          this.aliasMap.put(alias, resolvedName);
         }
       });
     }
   }
​
  /**
   * 校验给定的称号是否指向别号,不指向反常抛出
   */
  protected void checkForAliasCircle(String name, String alias) {
    if (hasAlias(alias, name)) {
      throw new IllegalStateException("Cannot register alias '" + alias +
          "' for name '" + name + "': Circular reference - '" +
          name + "' is a direct or indirect alias for '" + alias + "' already");
     }
   }
​
  /**
   * 依据给定的别号获取标准称号
   */
  public String canonicalName(String name) {
    String canonicalName = name;
    // Handle aliasing...
    String resolvedName;
    do {
      //获取给定别号的标准称号,获取到跳出循环
      resolvedName = this.aliasMap.get(canonicalName);
      if (resolvedName != null) {
        canonicalName = resolvedName;
       }
     }
    while (resolvedName != null);
    return canonicalName;
   }
}
name-alias能够循环引证如: a->b ,c->a ,d->calias->name循环映射如下:
注册表有如下映射: 
A-B; C-A;D-C
 1. B对应的aliasACD
 2. A对应的aliasCD
 3. C对应的aliasD
public class TestMain {
​
  public static void main(String[] args) {
    SimpleAliasRegistry aliasRegistry = new SimpleAliasRegistry();
    aliasRegistry.registerAlias("B", "A");
    aliasRegistry.registerAlias("A", "C");
    aliasRegistry.registerAlias("C", "D");
    System.out.println("B的别号:" +            
             Arrays.toString(aliasRegistry.getAliases("B")));
    System.out.println("A的别号:" + 
                 Arrays.toString(aliasRegistry.getAliases("A")));
    System.out.println("C的别号:" +        
                     Arrays.toString(aliasRegistry.getAliases("C")));
   }
}
​
//打印成果:
B的别号:[A, C, D]
A的别号:[C, D]
C的别号:[D]
​
也便是经过ABCD都能够找到这一个bean

SingletonBeanRegistry接口

SingletonBeanRegistry。单例Bean的注册接口。

//查看此注册表是否包括具有给定称号的单例实例。
boolean containsSingleton(String beanName)
//回来在给定称号下注册的(原始)单例目标。
Object getSingleton(String beanName)
//回来在此注册表中注册的单例bean的数量。
int getSingletonCount()
//回来此注册表运用的单例互斥锁(关于外部协作者)。
Object getSingletonMutex()
//回来在此注册表中注册的单例bean的称号。
String[] getSingletonNames()
//在给定的bean称号下,在bean注册表中将给定的现有目标注册为singleton。
void registerSingleton(String beanName, Object singletonObject)

DefaultSingletonBeanRegistry:SingletonBeanRegistry完成类

DefaultSingletonBeanRegistry。SingletionBean注册器的默许完成,一起承继SimpleAliasRegistry。因此这个类能够有别号注册的功用和单例bean注册的功用,而且他还支撑注册DisposableBean实例;它依靠ObjectFactory接口和DisposableBean接口(封闭注册表时调用到了destroy办法)。侧重于Bean的注册,毁掉,以及依靠联系(关联联系)的注册和毁掉。

/**
 * 同享bean实例的通用注册表,完成了SingletonBeanRegistry. 答应注册表中注册的单例应该被一切调用者同享,经过bean称号获得。 
 * 
 * 还支撑挂号的DisposableBean实例,(这可能会或不能正确的注册单例),封闭注册表时destroyed. 
 * 能够注册bean之间的依靠联系,履行适当的封闭顺序。 
 * 
 * 这个类首要用作基类的BeanFactory完成, 供给基本的办理 
 * singleton bean 实例功用。 
 */ 
public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements 
    SingletonBeanRegistry { 
 
//内部标记为一个空的单例目标: 并发 Maps( 不支撑空值 )作为标志值。 
  protected static final Object NULL_OBJECT = new Object(); 
 
// 日记用来记载子类 
  protected final Log logger = LogFactory.getLog(getClass()); 
 
//是寄存singleton目标的缓存 
  private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(); 
 
// 是寄存制作singleton的工厂目标的缓存 
  private final Map<String, ObjectFactory> singletonFactories = new HashMap<String, ObjectFactory>(); 
 
//是寄存singletonFactory 制作出来的 singleton 的缓存前期单例目标缓存</span><span> 
  private final Map<String, Object> earlySingletonObjects = new HashMap<String, Object>(); 
//以上三个缓存是这个类寄存单例bean的首要Map 
//便是单例注册表</span><span> 
  private final Set<String> registeredSingletons = new LinkedHashSet<String>( 
      16); 
 
//现在正在创立中的单例bean的称号的调集</span><span> 
  private final Set<String> singletonsCurrentlyInCreation = Collections 
       .synchronizedSet(new HashSet<String>()); 
 
//寄存反常呈现的相关的原因的调集</span><span> 
  private Set<Exception> suppressedExceptions; 
 
//标志,指示咱们现在是否在毁掉单例中</span><span> 
  private boolean singletonsCurrentlyInDestruction = false; 
 
//寄存一次性bean的缓存</span><span> 
  private final Map<String, Object> disposableBeans = new LinkedHashMap<String, Object>(); 
 
//外部bean与被包括在外部bean的一切内部bean调集包括联系的缓存 
  private final Map<String, Set<String>> containedBeanMap = new ConcurrentHashMap<String, Set<String>>(); 
 
//指定bean与依靠指定bean的一切bean的依靠联系的缓存 
  private final Map<String, Set<String>> dependentBeanMap = new ConcurrentHashMap<String, Set<String>>(); 
 
//指定bean与创立这个bean所需求依靠的一切bean的依靠联系的缓存</span><span> 
  private final Map<String, Set<String>> dependenciesForBeanMap = new ConcurrentHashMap<String, Set<String>>(); 
 
  // SingletonBeanRegistry接口的registerSingleton办法的完成 
  public void registerSingleton(String beanName, Object singletonObject) 
      throws IllegalStateException { 
    Assert.notNull(beanName, "'beanName' must not be null"); 
    synchronized (this.singletonObjects) { 
      Object oldObject = this.singletonObjects.get(beanName); 
</span><span>//假如singletonObjects缓存找到有指定称号为beanName的目标,则标明该称号已被占用 
      if (oldObject != null) { 
        throw new IllegalStateException("Could not register object [" 
            + singletonObject + "] under bean name '" + beanName 
            + "': there is already object [" + oldObject 
            + "] bound"); 
       } 
</span><span>//若该称号没被占用,真实的注册操作在这儿完成 
      addSingleton(beanName, singletonObject); 
     } 
   } 
 
   
  protected void addSingleton(String beanName, Object singletonObject) { 
    synchronized (this.singletonObjects) { 
      // 由于singletonObjects类型是ConcurrentHashMap,并发Map不支撑空值作为标志值,所以用NULL_OBJECT来替代 
      this.singletonObjects.put(beanName, 
           (singletonObject != null ? singletonObject : NULL_OBJECT)); 
      // beanName已被注册寄存在singletonObjects缓存,那么singletonFactories不应该再持有称号为beanName的工厂 
      this.singletonFactories.remove(beanName); 
      // beanName已被注册寄存在singletonObjects缓存,那么earlySingletonObjects不应该再持有称号为beanName的bean。 
      this.earlySingletonObjects.remove(beanName); 
      // beanName放进单例注册表中 
      this.registeredSingletons.add(beanName); 
     } 
   } 
 
  /** 
   * 增加 称号为beanName的singletonFactory目标 
   * 
   */ 
  protected void addSingletonFactory(String beanName, 
      ObjectFactory singletonFactory) { 
    Assert.notNull(singletonFactory, "Singleton factory must not be null"); 
    synchronized (this.singletonObjects) { 
      // 判别singletonObjects内姓名为beanName是否被占用,若没有,进行注册操作 
      if (!this.singletonObjects.containsKey(beanName)) { 
        this.singletonFactories.put(beanName, singletonFactory); 
        this.earlySingletonObjects.remove(beanName); 
        this.registeredSingletons.add(beanName); 
       } 
     } 
   } 
 
  // SingletonBeanRegistry接口的getSingleton办法的完成 
  public Object getSingleton(String beanName) { 
    return getSingleton(beanName, true); 
   } 
 
 
  protected Object getSingleton(String beanName, boolean allowEarlyReference) { 
    Object singletonObject = this.singletonObjects.get(beanName); 
    // 假如singletonObjects指定beanName的目标是不存在的 
    if (singletonObject == null) { 
      synchronized (this.singletonObjects) { 
        singletonObject = this.earlySingletonObjects.get(beanName); 
        // 假如earlySingletonObjects指定的beanName的目标是不存在的且allowEarlyReference是答应的 
        if (singletonObject == null && allowEarlyReference) { 
          ObjectFactory singletonFactory = this.singletonFactories 
               .get(beanName); 
          // 假如存在指定beanName的singletonFactory目标 
          if (singletonFactory != null) { 
            // singletonFactory创立指定的单例目标 
            singletonObject = singletonFactory.getObject(); 
            // 这儿能够看出earlySingletonObjects缓存应该是寄存singletonFactory发生的singleton 
            this.earlySingletonObjects.put(beanName, 
                singletonObject); 
            // 这儿标明指定的beanName已被占用,所以要在singletonFactories移除该称号 
            this.singletonFactories.remove(beanName); 
           } 
         } 
       } 
     } 
    return (singletonObject != NULL_OBJECT ? singletonObject : null); 
   } 
 
 
  public Object getSingleton(String beanName, ObjectFactory singletonFactory) { 
    Assert.notNull(beanName, "'beanName' must not be null"); 
    synchronized (this.singletonObjects) { 
      Object singletonObject = this.singletonObjects.get(beanName); 
      // 假如singetonObjects缓存不存在称号为beanName的目标 
      if (singletonObject == null) { 
        // 假如现在在毁掉singellton 
        if (this.singletonsCurrentlyInDestruction) { 
          throw new BeanCreationNotAllowedException( 
              beanName, 
              "Singleton bean creation not allowed while the singletons of this factory are in destruction " 
                  + "(Do not request a bean from a BeanFactory in a destroy method implementation!)"); 
         } 
        if (logger.isDebugEnabled()) { 
          logger.debug("Creating shared instance of singleton bean '" 
              + beanName + "'"); 
         } 
        // 单例目标创立前的回调,默许完成注册正在创立的单例 
        beforeSingletonCreation(beanName); 
        // 判别存储反常相关原因的调集是否已存在 
        boolean recordSuppressedExceptions = (this.suppressedExceptions == null); 
        // 若没有,刚创立反常调集的实例 
        if (recordSuppressedExceptions) { 
          this.suppressedExceptions = new LinkedHashSet<Exception>(); 
         } 
        try { 
          // 由参数给定的singletonFactory创立singleton目标,getObject办法的详细完成由ObjectFactory的子类决议 
          singletonObject = singletonFactory.getObject(); 
         } catch (BeanCreationException ex) { 
          // 假如反常被抓取,在这儿将呈现反常的原因抛出 
          if (recordSuppressedExceptions) { 
            for (Exception suppressedException : this.suppressedExceptions) { 
              ex.addRelatedCause(suppressedException); 
             } 
           } 
          throw ex; 
         } finally { 
          // 完毕前,将反常调集毁掉掉 
          if (recordSuppressedExceptions) { 
            this.suppressedExceptions = null; 
           } 
          // 单例创立之后的回调,默许的完成标志单例不要在创立了。 
          afterSingletonCreation(beanName); 
         } 
        // 注册创立后的单例 
        addSingleton(beanName, singletonObject); 
       } 
      return (singletonObject != NULL_OBJECT ? singletonObject : null); 
     } 
   } 
 
  /** 
   * 注册 发生在singeton bean 实例创立之间发生的反常 
   */ 
  protected void onSuppressedException(Exception ex) { 
    synchronized (this.singletonObjects) { 
      if (this.suppressedExceptions != null) { 
        this.suppressedExceptions.add(ex); 
       } 
     } 
   } 
 
  /** 
   * 移除称号为beanName的单例,首要在四个调集中移除, 
   * 如singletonObjects,singletonFactories,earlySingletonObjects 
   * ,registeredSingletons 
   * 
   */ 
  protected void removeSingleton(String beanName) { 
    synchronized (this.singletonObjects) { 
      this.singletonObjects.remove(beanName); 
      this.singletonFactories.remove(beanName); 
      this.earlySingletonObjects.remove(beanName); 
      this.registeredSingletons.remove(beanName); 
     } 
   } 
 
  // singletonBeanRegistry接口的containsSingleton办法完成 
  public boolean containsSingleton(String beanName) { 
    return (this.singletonObjects.containsKey(beanName)); 
   } 
 
  // singletonBeanRegistry接口的getSingletonNames办法完成 
  public String[] getSingletonNames() { 
    // 对singletonObjects加锁,可能是为了避免registeredSingletons和singletonObjects呈现不共同的问题 
    synchronized (this.singletonObjects) { 
      return StringUtils.toStringArray(this.registeredSingletons); 
     } 
   } 
 
  // singletonBeanRegistry接口的getSingletonCount办法完成 
  public int getSingletonCount() { 
    synchronized (this.singletonObjects) { 
      return this.registeredSingletons.size(); 
     } 
   } 
 
  /** 
   * 单例目标创立前的回调,默许完成singletonsCurrentlyInCreation调集注册正在创立的单例. 
   * 
   */ 
  protected void beforeSingletonCreation(String beanName) { 
    if (!this.singletonsCurrentlyInCreation.add(beanName)) { 
      throw new BeanCurrentlyInCreationException(beanName); 
     } 
   } 
 
  /** 
   * 单例创立之后的回调,默许完成singletonCurrentlyInCreation调集移除正在创立的单例</span><span> 
   * 
   */ 
  protected void afterSingletonCreation(String beanName) { 
    if (!this.singletonsCurrentlyInCreation.remove(beanName)) { 
      throw new IllegalStateException("Singleton '" + beanName 
          + "' isn't currently in creation"); 
     } 
   } 
 
  /** 
   * 回来 寄存正在创立单例的调集是否包括指定称号为beanName的单例存在 
   * 
   */ 
  public final boolean isSingletonCurrentlyInCreation(String beanName) { 
    return this.singletonsCurrentlyInCreation.contains(beanName); 
   } 
 
  /** 
   * 一次性bean注册,寄存在disponsableBeans调集中 
   * 
   */ 
  public void registerDisposableBean(String beanName, DisposableBean bean) { 
    synchronized (this.disposableBeans) { 
      this.disposableBeans.put(beanName, bean); 
     } 
   } 
 
  /** 
   * 注册两个bean之间的控制联系,例如内部bean和包括其的外部bean之间 
   * 
   */ 
  public void registerContainedBean(String containedBeanName, 
      String containingBeanName) { 
    synchronized (this.containedBeanMap) { 
      // 从containedBeanMap缓存中查找外部bean名为containingBeanName的内部bean调集 
      Set<String> containedBeans = this.containedBeanMap 
           .get(containingBeanName); 
      // 假如没有,刚新建一个寄存内部bean的调集,而且寄存在containedBeanMap缓存中 
      if (containedBeans == null) { 
        containedBeans = new LinkedHashSet<String>(8); 
        this.containedBeanMap.put(containingBeanName, containedBeans); 
       } 
      // 将名为containedBeanName的内部bean寄存到内部bean调集 
      containedBeans.add(containedBeanName); 
     } 
    // 紧接着调用注册内部bean和外部bean的依靠联系的办法 
    registerDependentBean(containedBeanName, containingBeanName); 
   } 
 
  /** 
   * 注册给定bean的一个依靠bean,给定的bean毁掉之前被毁掉。 
   * 
   */ 
  public void registerDependentBean(String beanName, String dependentBeanName) { 
    // 调用SimpleAliasRegistry的canonicalName办法,这办法是将参数beanName当做别号寻觅到注册名,并依此递归 
    String canonicalName = canonicalName(beanName); 
    synchronized (this.dependentBeanMap) { 
      // 从dependentBeanMap缓存中找到依靠名为canonicalName这个bean的 依靠bean调集 
      Set<String> dependentBeans = this.dependentBeanMap 
           .get(canonicalName); 
      // 假如为空,则新建一个依靠bean调集,而且寄存到dependentBeanMap缓存中 
      if (dependentBeans == null) { 
        dependentBeans = new LinkedHashSet<String>(8); 
        this.dependentBeanMap.put(canonicalName, dependentBeans); 
       } 
      // 依靠bean调集增加参数2指定的dependentBeanName 
      dependentBeans.add(dependentBeanName); 
     } 
    synchronized (this.dependenciesForBeanMap) { 
      // 从dependenciesForBeanMap缓存中找到dependentBeanName要依靠的一切bean调集 
      Set<String> dependenciesForBean = this.dependenciesForBeanMap 
           .get(dependentBeanName); 
      if (dependenciesForBean == null) { 
        dependenciesForBean = new LinkedHashSet<String>(8); 
        this.dependenciesForBeanMap.put(dependentBeanName, 
            dependenciesForBean); 
       } 
      dependenciesForBean.add(canonicalName); 
     } 
   } 
 
  /** 
   *  确定是否还存在名为beanName的被依靠联系 
   */ 
  protected boolean hasDependentBean(String beanName) { 
    return this.dependentBeanMap.containsKey(beanName); 
   } 
 
  /** 
   * 回来依靠于指定的bean的一切bean的称号,假如有的话。 
   * 
   */ 
  public String[] getDependentBeans(String beanName) { 
    Set<String> dependentBeans = this.dependentBeanMap.get(beanName); 
    if (dependentBeans == null) { 
      return new String[0]; 
     } 
    return StringUtils.toStringArray(dependentBeans); 
   } 
 
  /** 
   * 回来指定的bean依靠于一切的bean的称号,假如有的话。 
   * 
   */ 
  public String[] getDependenciesForBean(String beanName) { 
    Set<String> dependenciesForBean = this.dependenciesForBeanMap 
         .get(beanName); 
    // 假如没有的话回来new String[0]而不是null 
    if (dependenciesForBean == null) { 
      return new String[0]; 
     } 
    return dependenciesForBean.toArray(new String[dependenciesForBean 
         .size()]); 
   } 
 
  // 毁掉单例 
  public void destroySingletons() { 
    if (logger.isInfoEnabled()) { 
      logger.info("Destroying singletons in " + this); 
     } 
    // 单例现在毁掉标志开始 
    synchronized (this.singletonObjects) { 
      this.singletonsCurrentlyInDestruction = true; 
     } 
 
    // 毁掉disponsableBeans缓存中一切单例bean 
    synchronized (this.disposableBeans) { 
      String[] disposableBeanNames = StringUtils 
           .toStringArray(this.disposableBeans.keySet()); 
      for (int i = disposableBeanNames.length - 1; i >= 0; i--) { 
        destroySingleton(disposableBeanNames[i]); 
       } 
     } 
 
    // containedBeanMap缓存清空,dependentBeanMap缓存清空,dependenciesForBeanMap缓存清空 
    this.containedBeanMap.clear(); 
    this.dependentBeanMap.clear(); 
    this.dependenciesForBeanMap.clear(); 
 
    // singeltonObjects缓存清空,singletonFactories缓存清空,earlySingletonObjects缓存清空,registeredSingletons缓存清空 
    synchronized (this.singletonObjects) { 
      this.singletonObjects.clear(); 
      this.singletonFactories.clear(); 
      this.earlySingletonObjects.clear(); 
      this.registeredSingletons.clear(); 
      // 单例现在正在毁掉标志为完毕 
      this.singletonsCurrentlyInDestruction = false; 
     } 
   } 
 
 
  public void destroySingleton(String beanName) { 
    // Remove a registered singleton of the given name, if any. 
    removeSingleton(beanName); 
 
    // Destroy the corresponding DisposableBean instance. 
    DisposableBean disposableBean; 
    synchronized (this.disposableBeans) { 
      disposableBean = (DisposableBean) this.disposableBeans 
           .remove(beanName); 
     } 
    destroyBean(beanName, disposableBean); 
   } 
 
 
  protected void destroyBean(String beanName, DisposableBean bean) { 
    // Trigger destruction of dependent beans first... 
    // 这段代码告知咱们先移除要毁掉依靠bean 
    Set<String> dependencies = this.dependentBeanMap.remove(beanName); 
    if (dependencies != null) { 
      if (logger.isDebugEnabled()) { 
        logger.debug("Retrieved dependent beans for bean '" + beanName 
            + "': " + dependencies); 
       } 
      for (String dependentBeanName : dependencies) { 
        destroySingleton(dependentBeanName); 
       } 
     } 
 
    // Actually destroy the bean now... 
    // 毁掉bean实例 
    if (bean != null) { 
      try { 
        bean.destroy(); 
       } catch (Throwable ex) { 
        logger.error("Destroy method on bean with name '" + beanName 
            + "' threw an exception", ex); 
       } 
     } 
 
    // Trigger destruction of contained beans... 
    // 从containedBeanMap缓存中移除要毁掉的bean,递归移除它的包括内部bean调集 
    Set<String> containedBeans = this.containedBeanMap.remove(beanName); 
    if (containedBeans != null) { 
      for (String containedBeanName : containedBeans) { 
        destroySingleton(containedBeanName); 
       } 
     } 
 
    // Remove destroyed bean from other beans' dependencies. 
    // 从其它bean的依靠bean调集中移除要毁掉的bean 
    synchronized (this.dependentBeanMap) { 
      for (Iterator<Map.Entry<String, Set<String>>> it = this.dependentBeanMap 
           .entrySet().iterator(); it.hasNext();) { 
        Map.Entry<String, Set<String>> entry = it.next(); 
        Set<String> dependenciesToClean = entry.getValue(); 
        dependenciesToClean.remove(beanName); 
        if (dependenciesToClean.isEmpty()) { 
          it.remove(); 
         } 
       } 
     } 
     // Remove destroyed bean's prepared dependency information. 
    // 最终 从dependenciesForBeanMap缓存中移除要毁掉的bean 
    this.dependenciesForBeanMap.remove(beanName); 
   } 
   /** 
   * Expose the singleton mutex to subclasses. 
   * <p> 
   * Subclasses should synchronize on the given Object if they perform any 
   * sort of extended singleton creation phase. In particular, subclasses 
   * should <i>not</i> have their own mutexes involved in singleton creation, 
   * to avoid the potential for deadlocks in lazy-init situations. 
   */ 
  protected final Object getSingletonMutex() { 
    return this.singletonObjects; 
   } 
  } 

看姓名,就知道这是一个SingletonBean注册的地方,此类也完成了SingletonBeanRegistry接口,承继了SimpleAliasRegistry。这也能够理解,DefaultSingletonBeanRegistry既有办理SingletonBean的功用,又供给了别号的功用,那当然能够承继SimpleAliasRegistry了。 ​ DefaultSingletonBeanRegistry是一个通用的存储同享bean实例的地方,经过bean的姓名获得bean。一起,它也给供给一次性bean的注册功用。 ​ 这个类的首要作用是,给BeanFactory的完成,供给基本的办理singleton bean实例功用。 ​ 这个类中,运用了三个首要的存储器(map)来分别存储singletonObject,singletonFactory,earlySingletonObject。分别是一级缓存 二级缓存 三级缓存 。

当注册一个singleton object的时分,会在 singletonObject 的存储器中加入此 object,而在其他的两个存储器中移除。当然,这样的行为是能够在子类中去复写的。 ​ 在 getSingleton的时分,spring的默许完成是,先从 singleton object 的存储器中去寻觅,假如找不到,再从 early singleton object 存储器中寻觅,再找不到,那就在寻觅对应的 singleton factory,造出所需的 singleton object,然后回来。

而 contains singleton 便是直接查看 singleton object 存储器了,其他的存储器不做查看。而 get singleton counts 也是统计 singleton object 的数量。 ​ 看完了代码,再仔细想想,为什么这个类要运用三个存储器呢? ​ 我想, singletonObjects 便是直观的存储着 singleton 的,而 singletonFactories 是存储的制作 singleton 的工厂,还有一个 earlySingletonObject, 在看了代码之后,我更觉得这是一个 前期singletonFactory 制作出来的 singleton 的缓存。

一级缓存保存的是:成品

二级缓存保存的是:半成品

三级缓存保存的是:制作 singleton 的工厂

FactoryBeanRegistrySupport:抽象类

FactoryBeanRegistrySupport。这是一个抽象类,抽象类承继了DefaultSingletonBeanRegistry类,增加了对FactoryBean的处理。

参阅本篇博文

BeanFactory接口

BeanFactory。BeanFactory是Spring IOC完成的根底,这边定义了一系列的接口,咱们经过这些接口的学习,能够大致了解BeanFactory系统各接口如何分工合作。

package org.springframework.beans.factory;
​
public interface BeanFactory {
​
  /**
   * 用来引证一个实例,或把它和工厂发生的Bean区分开,便是说,假如一个FactoryBean的姓名为a,那么,&a会得到那个Factory
   */
  String FACTORY_BEAN_PREFIX = "&";
​
  /*
   * 四个不同形式的getBean办法,获取实例
   */
  Object getBean(String name) throws BeansException;
​
  <T> T getBean(String name, Class<T> requiredType) throws BeansException;
​
  <T> T getBean(Class<T> requiredType) throws BeansException;
​
  Object getBean(String name, Object... args) throws BeansException;
​
  boolean containsBean(String name); // 是否存在boolean isSingleton(String name) throws NoSuchBeanDefinitionException;// 是否为单实例boolean isPrototype(String name) throws NoSuchBeanDefinitionException;// 是否为原型(多实例)boolean isTypeMatch(String name, Class<?> targetType)
      throws NoSuchBeanDefinitionException;// 称号、类型是否匹配
​
  Class<?> getType(String name) throws NoSuchBeanDefinitionException; // 获取类型
​
  String[] getAliases(String name);// 依据实例的姓名获取实例的别号
​
}

详细: 1、4个获取实例的办法。getBean的重载办法。 2、4个判别的办法。判别是否存在,是否为单例、原型,称号类型是否匹配。 3、1个获取类型的办法、一个获取别号的办法。依据称号获取类型、依据称号获取别号。一目了然! 总结: 这10个办法,很明显,这是一个典型的工厂形式的工厂接口。

ListableBeanFactory接口

ListableBeanFactory。望文生义,定义查找bean的办法。

public interface ListableBeanFactory extends BeanFactory {
​
  // 关于给定的姓名是否含有BeanDefinition
  boolean containsBeanDefinition(String beanName);
​
  // 回来BeanDefinition总数
  int getBeanDefinitionCount();
​
  // 回来工厂中一切Bean的姓名
  String[] getBeanDefinitionNames();
  //-------------------------------------------------------------------------
  // 依据bean 的类型获取bean
  //
  // 这边的办法仅查看顶级bean.它不会查看嵌套的bean.FactoryBean创立的bean会匹配为FactoryBean而不是原始类型.
  // 相同不会考虑父factory中的bean,非要用能够经过BeanFactoryUtils中的beanNamesForTypeIncludingAncestors.
  // 其他方式注册的单例这边会归入判别.
  // 这个版别的getBeanNamesForType会匹配一切类型的bean,包括单例,原型,FactoryBean.回来的bean names会依据backend 装备的进行排序.
  //-------------------------------------------------------------------------
  String[] getBeanNamesForType(ResolvableType type);
  // 获取给定类型的bean names(包括子类),经过bean 定义或者FactoryBean的getObjectType判别.
  // 回来关于指定类型Bean(包括子类)的一切姓名
  String[] getBeanNamesForType(@Nullable Class<?> type);
​
  /*
   * 回来指定类型的姓名 includeNonSingletons为false标明只取单例Bean,true则不是
   * allowEagerInit为true标明立刻加载,false标明推迟加载。 留意:FactoryBeans都是立刻加载的。
   */
  String[] getBeanNamesForType(@Nullable Class<?> type, boolean includeNonSingletons, boolean allowEagerInit);
​
  // 假如维护懒加载的类,FactoryBean初始化的类和工厂办法初始化的类会被初始化.便是说履行这个办法会履行对应的初始化.
  // 依据类型(包括子类)回来指定Bean名和Bean的Map
  <T> Map<String, T> getBeansOfType(@Nullable Class<T> type) throws BeansException;
​
  <T> Map<String, T> getBeansOfType(@Nullable Class<T> type, boolean includeNonSingletons, boolean allowEagerInit)
      throws BeansException;
  // 查找运用注解的类
  String[] getBeanNamesForAnnotation(Class<? extends Annotation> annotationType);
  // 依据注解类型,查找一切有这个注解的Bean名和Bean的Map
  Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) throws BeansException;
​
  // 依据指定Bean名和注解类型查找指定的Bean
  @Nullable
  <A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType)
      throws NoSuchBeanDefinitionException;
​
}

HierarchicalBeanFactory接口

public interface HierarchicalBeanFactory extends BeanFactory {
  //回来本Bean工厂的父工厂
  BeanFactory getParentBeanFactory();
​
   //本地工厂(容器)是否包括这个Bean
  boolean containsLocalBean(String name);
}

HierarchicalBeanFactory源码详细: 1、第一个办法回来本Bean工厂的父工厂。这个办法完成了工厂的分层。 2、第二个办法判别本地工厂是否包括这个Bean(疏忽其他一切父工厂)。这也是分层思维的体现。 总结:这个工厂接口非常简略,完成了Bean工厂的分层。这个工厂接口也是承继自BeanFacotory,也是一个二级接口,相关于父接口,它只扩展了一个重要的功用——工厂分层。

AutowireCapableBeanFactory接口

从微观上看,AutowireCapableBeanFactory供给了如下才能:

  • 为已经实例化的目标安装特点,这些特点目标都是Spring办理的;
  • 实例化一个Bean,并主动安装,这些被安装的特点目标都是Spring办理的,但是实例化的Bean能够不被Spring办理(这点特别重要)。所以这个接口供给功用便是主动安装bean相关的。

主动安装的原目标能够不在Spring的IOC容器里,但是需求被依靠注入的成员,就必须是Spring容器管辖的Bean。此接口首要是针对结构之外,没有向Spring保管Bean的运用。经过露出此功用,Spring结构之外的程序,也能具有主动安装的才能(此接口赋予它的)。 ​ 能够运用这个接口集成其它结构。绑缚并填充(注入)并不由Spring办理生命周期并已存在的实例。像集成WebWork的Actions 和Tapestry Page就很实用。 ​ 一般运用开发者不会运用这个接口,所以像ApplicationContext这样的外观完成类不会完成这个接口,但是供给了getAutowireCapableBeanFactory()办法答应你拿这个东西去做你需求的事。

public interface AutowireCapableBeanFactory01 extends BeanFactory {
  /**
   * 标明工厂没有主动安装的Bean
   */
  int AUTOWIRE_NO = 0;
​
  /**
   * 标明依据称号主动安装
   */
  int AUTOWIRE_BY_NAME = 1;
​
  /**
   * 标明依据类型主动安装
   */
  int AUTOWIRE_BY_TYPE = 2;
​
  /**
   * 标明依据结构办法快速安装
   */
  int AUTOWIRE_CONSTRUCTOR = 3;
​
  @Deprecated
  // 标明经过Bean的class的内部来主动安装 Spring3.0被弃用。
  int AUTOWIRE_AUTODETECT = 4;
​
  String ORIGINAL_INSTANCE_SUFFIX = ".ORIGINAL";
​
  /**
   * 创立一个指定class的实例
   */
  <T> T createBean(Class<T> beanClass) throws BeansException;
​
  /**
   * 经过调用给定Bean的after-instantiation及post-processing接口,对bean进行装备
   */
  void autowireBean(Object existingBean) throws BeansException;
​
  /**
   * 主动安装特点,填充特点值,运用诸如setBeanName,setBeanFactory这样的工厂回调填充特点,最好还要调用post processor
   */
  Object configureBean(Object existingBean, String beanName) throws BeansException;
​
  /**
   * 创立一个指定class的实例,经过参数能够指定其主动安装形式(by-name or by-type).
   */
  Object createBean(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;
​
  /**
   * 经过指定的主动安装策略来初始化一个Bean
   */
  Object autowire(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;
​
  /**
   * 经过指定的主动安装方式来对给定的Bean进行主动安装
   */
  void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck)
      throws BeansException;
​
  /**
   * 将参数中指定了那么的Bean,注入给定实例当中
   */
  void applyBeanPropertyValues(Object existingBean, String beanName) throws BeansException;
​
  /**
   * 初始化参数中指定的Bean,调用任何其注册的回调函数如setBeanName、setBeanFactory等。
   */
  Object initializeBean(Object existingBean, String beanName) throws BeansException;
​
  /**
   * 调用参数中指定Bean的postProcessBeforeInitialization办法
   */
  Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
      throws BeansException;
​
  /**
   * 调用参数中指定Bean的postProcessAfterInitialization办法
   */
  Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
      throws BeansException;
​
  /**
   * 毁掉参数中指定的Bean,一起调用此Bean上的DisposableBean和DestructionAwareBeanPostProcessors办法
   */
  void destroyBean(Object existingBean);
​
  /**
   * 查找唯一符合指定类的实例,假如有,则回来实例的姓名和实例自身
   * 底层依靠于:BeanFactory中的getBean(Class)办法
   */
  <T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType) throws BeansException;
​
  /**
   * 解析出在Factory中与指定Bean有指定依靠联系的Bean(@Autowired依靠注入的中心办法)
   */
  Object resolveBeanByName(String name, DependencyDescriptor descriptor) throws BeansException;
​
  @Nullable
  Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName) throws BeansException;
​
  @Nullable
  Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName,@Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException;
}

ConfigurableBeanFactory接口

巨大的接口,看的我头痛,能够参阅这篇博文。

ConfigurableListableBeanFactory接口

工厂接口ConfigurableListableBeanFactory一起承继了3个接口,ListableBeanFactory、AutowireCapableBeanFactory和 ConfigurableBeanFactory,供给bean definition的解析,注册功用,再对单例来个预加载(解决循环依靠问题)。

public interface ConfigurableListableBeanFactory
    extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory {
  // 设置疏忽的依靠联系,注册找到的特别依靠
  void ignoreDependencyType(Class<?> type);
​
  //疏忽主动安装的依靠类型
  void ignoreDependencyInterface(Class<?> ifc);
​
  //注册一个可分解的依靠
  void registerResolvableDependency(Class<?> dependencyType, @Nullable Object autowiredValue);
​
  //判别指定的Bean是否有资格作为主动安装的候选者
  boolean isAutowireCandidate(String beanName, DependencyDescriptor descriptor)
      throws NoSuchBeanDefinitionException;
​
  //回来注册的Bean定义
  BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
​
  Iterator<String> getBeanNamesIterator();
​
  void clearMetadataCache();
  // 锁定装备信息.在调用refresh时会运用到.
  //暂时冻结一切的Bean装备
  void freezeConfiguration();
​
  //判别本工厂装备是否被冻结
  boolean isConfigurationFrozen();
​
  //使一切的非推迟加载的单例类都实例化。
  void preInstantiateSingletons() throws BeansException;
}

AbstractBeanFactory抽象类

作为一个抽象类,完成了三级接口ConfigurableBeanFactory大部分功用,牛逼的不行。参阅这篇博文

DefaultListableBeanFactory:默许可查找BeanFactory完成

以上讲的无论接口、完成类仍是抽象类,最终汇合在DefaultListableBeanFactory,spring发动时分会new一个DefaultListableBeanFactory类型的bean工厂,便是IOC容器啦~重要性可想而知。参阅这篇博文。

DefaultListableBeanFactory承继了DefaultSingletonBeanRegistry。DefaultSingletonBeanRegistry

实例化的时机是在DefaultListableBeanFactory实例化的时分。实例化DefaultListableBeanFactory的时分需求初始化父类。因此会初始化DefaultSingletonBeanRegistry。

  /**
   * 而这个beanFactory是AnnotationConfigApplicationContext
   * 在履行自己的结构办法this()时
   * 先去履行了父类GenericApplicationContext的结构办法
   * 完成了this.beanFactory = new DefaultListableBeanFactory()
   * */