日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring DefaultListableBeanFactory

發布時間:2024/4/13 javascript 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring DefaultListableBeanFactory 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

類繼承圖

Registry

AliasRegistry

SimpleAliasRegistry

SingletonBeanRegistry

DefaultSingletonBeanRegistry

屬性

?FactoryBeanRegistrySupport

源碼解析

屬性

BeanFactory接口方法

ConfigurableListableBeanFactory接口方法

BeanDefinitionRegistry接口方法


Spring BeanFactory

Spring AbstractBeanFactory

Spring AbstractAutowireCapableBeanFactory

Spring DefaultListableBeanFactory

?

DefaultListableBeanFactory,繼承了AbstractAutowireCapableBeanFactory及實現了ConfigurableListableBeanFactory、BeanDefinitionRegistry接口。

spring Ioc容器的實現,從根源上是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

實現了AliasRegistry接口,用ConcurrentHashMap存儲別名的對應關系,別名作為key,name作為value。用于快速訪問到別名對應的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以及實現了SingletonBeanRegistry的接口。處理Bean的注冊,銷毀,以及依賴關系的注冊和銷毀。

屬性

// 單例對象的緩存: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); // 正在創建的單例的beanName的集合 private final Set<String> singletonsCurrentlyInCreation = Collections.newSetFromMap(new ConcurrentHashMap<>(16)); // 當前不檢查的bean的集合 private final Set<String> inCreationCheckExclusions = Collections.newSetFromMap(new ConcurrentHashMap<>(16)); // 異常集合 private Set<Exception> suppressedExceptions; // 當前是否在銷毀bean中 private boolean singletonsCurrentlyInDestruction = false; // 一次性bean實例 private final Map<String, Object> disposableBeans = new LinkedHashMap<>(); // 內部bean和外部bean之間關系 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定義名數組 private volatile String[] frozenBeanDefinitionNames; // 是否可以緩存所有bean的bean定義元數據 private volatile boolean configurationFrozen = false;

BeanFactory接口方法

@Override// 根據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) {//單例并且沒有構造參數,返回單例。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());//如果沒有最合適的,選擇高優先級的。if (candidateName == null) {candidateName = determineHighestPriorityCandidate(candidates, requiredType.toClass());}//找到了候選者,if (candidateName != null) {Object beanInstance = candidates.get(candidateName);if (beanInstance == null || beanInstance instanceof Class) {//實例不存在,則構造實例。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接口方法

?

?

?

?

?

總結

以上是生活随笔為你收集整理的Spring DefaultListableBeanFactory的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。