javascript
Spring DefaultListableBeanFactory
目錄
類繼承圖
Registry
AliasRegistry
SimpleAliasRegistry
SingletonBeanRegistry
DefaultSingletonBeanRegistry
屬性
?FactoryBeanRegistrySupport
源碼解析
屬性
BeanFactory接口方法
ConfigurableListableBeanFactory接口方法
BeanDefinitionRegistry接口方法
Spring BeanFactory
Spring AbstractBeanFactory
Spring AbstractAutowireCapableBeanFactory
Spring DefaultListableBeanFactory
?
DefaultListableBeanFactory,繼承了AbstractAutowireCapableBeanFactory及實現(xiàn)了ConfigurableListableBeanFactory、BeanDefinitionRegistry接口。
spring Ioc容器的實現(xiàn),從根源上是beanfactory,但真正可以作為一個可以獨立使用的ioc容器還是DefaultListableBeanFactory,因此可以這么說,DefaultListableBeanFactory 是整個spring ioc的始祖。
類繼承圖
Registry
提供對對象的注冊管理。
AliasRegistry
AliasRegistry接口是對別名增刪改查等管理。
public interface AliasRegistry {void registerAlias(String name, String alias);void removeAlias(String alias);boolean isAlias(String name);String[] getAliases(String name); }SimpleAliasRegistry
實現(xiàn)了AliasRegistry接口,用ConcurrentHashMap存儲別名的對應(yīng)關(guān)系,別名作為key,name作為value。用于快速訪問到別名對應(yīng)的beanName。
private final Map<String, String> aliasMap = new ConcurrentHashMap<>(16);SingletonBeanRegistry
用于單例bean的注冊管理等。
public interface SingletonBeanRegistry {void registerSingleton(String beanName, Object singletonObject);@NullableObject getSingleton(String beanName);boolean containsSingleton(String beanName);String[] getSingletonNames();int getSingletonCount();Object getSingletonMutex(); }DefaultSingletonBeanRegistry
DefaultSingletonBeanRegistry類繼承了SimpleAliasRegistry以及實現(xiàn)了SingletonBeanRegistry的接口。處理Bean的注冊,銷毀,以及依賴關(guān)系的注冊和銷毀。
屬性
// 單例對象的緩存:key:beanname,value:bean實例 // 加入了單例對象的緩存(對象已初始化完成),那singletonFactories和earlySingletonObjects就不再需要了。 private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256); // 單例工廠的緩存:key:beanname , value:ObjectFactory private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16); // 早期單例對象的緩存:key:beanname,value:bean實例,bean實例未初始化完成。 private final Map<String, Object> earlySingletonObjects = new HashMap<>(16); // 一組已注冊的單例,包含按注冊順序排列的beanname private final Set<String> registeredSingletons = new LinkedHashSet<>(256); // 正在創(chuàng)建的單例的beanName的集合 private final Set<String> singletonsCurrentlyInCreation = Collections.newSetFromMap(new ConcurrentHashMap<>(16)); // 當(dāng)前不檢查的bean的集合 private final Set<String> inCreationCheckExclusions = Collections.newSetFromMap(new ConcurrentHashMap<>(16)); // 異常集合 private Set<Exception> suppressedExceptions; // 當(dāng)前是否在銷毀bean中 private boolean singletonsCurrentlyInDestruction = false; // 一次性bean實例 private final Map<String, Object> disposableBeans = new LinkedHashMap<>(); // 內(nèi)部bean和外部bean之間關(guān)系 private final Map<String, Set<String>> containedBeanMap = new ConcurrentHashMap<>(16); // 指定bean與依賴指定bean的集合,比如bcd依賴a,那么就是key為a,bcd為value private final Map<String, Set<String>> dependentBeanMap = new ConcurrentHashMap<>(64); // 指定bean與指定bean依賴的集合,比如a依賴bcd,那么就是key為a,bcd為value private final Map<String, Set<String>> dependenciesForBeanMap = new ConcurrentHashMap<>(64);?FactoryBeanRegistrySupport
FactoryBeanRegistrySupport抽象類繼承了DefaultSingletonBeanRegistry類,增加了對FactoryBean的處理。
private final Map<String, Object> factoryBeanObjectCache = new ConcurrentHashMap<>(16);源碼解析
屬性
// JSR-330 支持 private static Class<?> javaxInjectProviderClass; // DefaultListableBeanFactory引用的緩存 private static final Map<String, Reference<DefaultListableBeanFactory>> serializableFactories = new ConcurrentHashMap<>(8); // 序列號id private String serializationId; // 是否允許用相同的名稱重新注冊不同的定義 private boolean allowBeanDefinitionOverriding = true; // 是否允許懶加載 private boolean allowEagerClassLoading = true; // 依賴排序順序 private Comparator<Object> dependencyComparator; // 解析器,用于檢查bean定義是否為自動裝配候選 private AutowireCandidateResolver autowireCandidateResolver = new SimpleAutowireCandidateResolver(); // 依賴類型和自動注入值的映射 private final Map<Class<?>, Object> resolvableDependencies = new ConcurrentHashMap<>(16); // BeanDefinition和beanName的映射 private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256); // 依賴類型和單例、非單例bean的映射 private final Map<Class<?>, String[]> allBeanNamesByType = new ConcurrentHashMap<>(64); // 依賴類型和單例bean的映射 private final Map<Class<?>, String[]> singletonBeanNamesByType = new ConcurrentHashMap<>(64); // bean定義名稱列表,按注冊順序排列。 private volatile List<String> beanDefinitionNames = new ArrayList<>(256); // 手動注冊的單例,按注冊順序排列 private volatile Set<String> manualSingletonNames = new LinkedHashSet<>(16); // 固定配置的緩存的bean定義名數(shù)組 private volatile String[] frozenBeanDefinitionNames; // 是否可以緩存所有bean的bean定義元數(shù)據(jù) private volatile boolean configurationFrozen = false;BeanFactory接口方法
@Override// 根據(jù)class類型獲取beanpublic <T> T getBean(Class<T> requiredType) throws BeansException {return getBean(requiredType, (Object[]) null);}@SuppressWarnings("unchecked")@Overridepublic <T> T getBean(Class<T> requiredType, @Nullable Object... args) throws BeansException {Assert.notNull(requiredType, "Required type must not be null");Object resolved = resolveBean(ResolvableType.forRawClass(requiredType), args, false);if (resolved == null) {throw new NoSuchBeanDefinitionException(requiredType);}return (T) resolved;}@Nullableprivate <T> T resolveBean(ResolvableType requiredType, @Nullable Object[] args, boolean nonUniqueAsNull) {NamedBeanHolder<T> namedBean = resolveNamedBean(requiredType, args, nonUniqueAsNull);if (namedBean != null) {return namedBean.getBeanInstance();}BeanFactory parent = getParentBeanFactory();if (parent instanceof DefaultListableBeanFactory) {return ((DefaultListableBeanFactory) parent).resolveBean(requiredType, args, nonUniqueAsNull);}else if (parent != null) {//查找祖先BeanFactory的 ObjectProviderObjectProvider<T> parentProvider = parent.getBeanProvider(requiredType);if (args != null) {return parentProvider.getObject(args);}else {return (nonUniqueAsNull ? parentProvider.getIfUnique() : parentProvider.getIfAvailable());}}return null;}@Nullable//通過類型解析beanprivate <T> NamedBeanHolder<T> resolveNamedBean(ResolvableType requiredType, @Nullable Object[] args, boolean nonUniqueAsNull) throws BeansException {Assert.notNull(requiredType, "Required type must not be null");//通過類型獲取所有bean NamesString[] candidateNames = getBeanNamesForType(requiredType);if (candidateNames.length > 1) {List<String> autowireCandidates = new ArrayList<>(candidateNames.length);for (String beanName : candidateNames) {if (!containsBeanDefinition(beanName) || getBeanDefinition(beanName).isAutowireCandidate()) {autowireCandidates.add(beanName);}}if (!autowireCandidates.isEmpty()) {candidateNames = StringUtils.toStringArray(autowireCandidates);}}//僅有一個直接返回if (candidateNames.length == 1) {String beanName = candidateNames[0];return new NamedBeanHolder<>(beanName, (T) getBean(beanName, requiredType.toClass(), args));}else if (candidateNames.length > 1) {Map<String, Object> candidates = new LinkedHashMap<>(candidateNames.length);for (String beanName : candidateNames) {//單例并且沒有構(gòu)造參數(shù),返回單例。if (containsSingleton(beanName) && args == null) {Object beanInstance = getBean(beanName);candidates.put(beanName, (beanInstance instanceof NullBean ? null : beanInstance));}else {candidates.put(beanName, getType(beanName));}}//選擇最合適的候選對象。String candidateName = determinePrimaryCandidate(candidates, requiredType.toClass());//如果沒有最合適的,選擇高優(yōu)先級的。if (candidateName == null) {candidateName = determineHighestPriorityCandidate(candidates, requiredType.toClass());}//找到了候選者,if (candidateName != null) {Object beanInstance = candidates.get(candidateName);if (beanInstance == null || beanInstance instanceof Class) {//實例不存在,則構(gòu)造實例。beanInstance = getBean(candidateName, requiredType.toClass(), args);}return new NamedBeanHolder<>(candidateName, (T) beanInstance);}//多個候選者,判斷是否拋出異常。if (!nonUniqueAsNull) {throw new NoUniqueBeanDefinitionException(requiredType, candidates.keySet());}}return null;}@Overridepublic <T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType) throws BeansException {Assert.notNull(requiredType, "Required type must not be null");NamedBeanHolder<T> namedBean = resolveNamedBean(ResolvableType.forRawClass(requiredType), null, false);if (namedBean != null) {return namedBean;}BeanFactory parent = getParentBeanFactory();if (parent instanceof AutowireCapableBeanFactory) {return ((AutowireCapableBeanFactory) parent).resolveNamedBean(requiredType);}throw new NoSuchBeanDefinitionException(requiredType);}ConfigurableListableBeanFactory接口方法
略
BeanDefinitionRegistry接口方法
略
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的Spring DefaultListableBeanFactory的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring AbstractAutow
- 下一篇: Spring WebApplicatio