// ②doGetBean // 第一次创建,缓存中不存在,则会进行创建 sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() { @Override public Object getObject()throws BeansException { try { // 创建bean return createBean(beanName, mbd, args); } catch (BeansException ex) { // Explicitly remove instance from singleton cache: It might have been put there // eagerly by the creation process, to allow for circular reference resolution. // Also remove any beans that received a temporary reference to the bean. destroySingleton(beanName); throw ex; } } });
// 负责管理 Spring 容器中的单例 Bean,包括 Bean 的注册、获取、销毁以及处理 Bean 之间的依赖关系 publicclassDefaultSingletonBeanRegistryextendsSimpleAliasRegistryimplementsSingletonBeanRegistry{
/** * Internal marker for a null singleton object: * used as marker value for concurrent Maps (which don't support null values). */ protectedstaticfinal Object NULL_OBJECT = new Object();
/** Logger available to subclasses */ protectedfinal Log logger = LogFactory.getLog(getClass());
/** Cache of singleton objects: bean name --> bean instance */ // 存储完全初始化的单例 Bean privatefinal Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(256);
/** Cache of singleton factories: bean name --> ObjectFactory */ // 存储 Bean 工厂,用于解决循环依赖 privatefinal Map<String, ObjectFactory<?>> singletonFactories = new HashMap<String, ObjectFactory<?>>(16);
/** Cache of early singleton objects: bean name --> bean instance */ // 存储提前曝光的单例 Bean(尚未完全初始化) privatefinal Map<String, Object> earlySingletonObjects = new HashMap<String, Object>(16);
/** Set of registered singletons, containing the bean names in registration order */ // 记录已注册的单例 Bean 名称 privatefinal Set<String> registeredSingletons = new LinkedHashSet<String>(256);
/** Names of beans that are currently in creation */ // 记录正在创建中的 Bean privatefinal Set<String> singletonsCurrentlyInCreation = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>(16));
/** Names of beans currently excluded from in creation checks */ privatefinal Set<String> inCreationCheckExclusions = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>(16));
/** List of suppressed Exceptions, available for associating related causes */ private Set<Exception> suppressedExceptions;
/** Flag that indicates whether we're currently within destroySingletons */ privateboolean singletonsCurrentlyInDestruction = false;
/** Map between containing bean names: bean name --> Set of bean names that the bean contains */ privatefinal Map<String, Set<String>> containedBeanMap = new ConcurrentHashMap<String, Set<String>>(16);
/** Map between dependent bean names: bean name --> Set of dependent bean names */ // 维护 Bean 之间的依赖关系 privatefinal Map<String, Set<String>> dependentBeanMap = new ConcurrentHashMap<String, Set<String>>(64);
/** Map between depending bean names: bean name --> Set of bean names for the bean's dependencies */ // 维护 Bean 之间的依赖关系 privatefinal Map<String, Set<String>> dependenciesForBeanMap = new ConcurrentHashMap<String, Set<String>>(64);
v1.3.10