DetaultListableBeanFactory分層關(guān)系解析一

DefaultListableBeanFactory

首先是繼承圖

[圖片上傳失敗...(image-5d521d-1558969519678)]

BeanFactory最基礎(chǔ)的bean生產(chǎn)工廠的主要實(shí)現(xiàn)功能

String FACTORY_BEAN_PREFIX = "&";


//根據(jù)name獲取一個(gè)bean對(duì)象
Object getBean(String name) throws BeansException;

//根據(jù)name和requireType指定的類型獲取指定的bean實(shí)例
<T> T getBean(String name, Class<T> requiredType) throws BeansException;

//根據(jù)name和args參數(shù)獲取bean實(shí)例饱亮,注意:args是bean的構(gòu)造器的參數(shù)
Object getBean(String name, Object... args) throws BeansException;

//根據(jù)requireType類型獲取bean猖腕,也可能使用Type的名字獲取bean
<T> T getBean(Class<T> requiredType) throws BeansException;

//根據(jù)類型和構(gòu)造器參數(shù)獲取bean
<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;

//獲取一個(gè)requireType類型的bean的封裝對(duì)象,可以進(jìn)行后續(xù)復(fù)雜的操作
//如根據(jù)參數(shù)實(shí)例化一個(gè)bean,對(duì)于匹配了多個(gè)bean的情況,可以進(jìn)行stream()
//操作排除NullBean,或者是對(duì)多個(gè)匹配的bean進(jìn)行排序
<T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);


<T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType);

//檢查工廠是否包含name對(duì)應(yīng)的bean或者有無單例bean
boolean containsBean(String name);

//判斷bean的實(shí)例化模式是否是singleton單例模式
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

//判斷bean的實(shí)例化模式是否是prototype
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

//檢查name對(duì)應(yīng)的bean與typeToMatch對(duì)應(yīng)的類型是否一致
boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;

//檢查name對(duì)應(yīng)的bean與typeToMatch對(duì)應(yīng)的類型是否一致
boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;


@Nullable
//根據(jù)name查找對(duì)應(yīng)的bean的類型
Class<?> getType(String name) throws NoSuchBeanDefinitionException;


String[] getAliases(String name);//獲取name對(duì)應(yīng)的bean的別名,就是外號(hào)

BeanObjectProvider的一個(gè)實(shí)現(xiàn)類

public <T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType) {
    return new BeanObjectProvider<T>() {
        @Override
        public T getObject() throws BeansException {
            T resolved = resolveBean(requiredType, null, false);
            if (resolved == null) {
                throw new NoSuchBeanDefinitionException(requiredType);
            }
            return resolved;
        }
        @Override
        public T getObject(Object... args) throws BeansException {
            T resolved = resolveBean(requiredType, args, false);
            if (resolved == null) {
                throw new NoSuchBeanDefinitionException(requiredType);
            }
            return resolved;
        }
        @Override
        @Nullable
        //當(dāng)無法獲取時(shí)返回null
        public T getIfAvailable() throws BeansException {
            return resolveBean(requiredType, null, false);
        }
        @Override
        @Nullable
        //當(dāng)無法獲取和~~不唯一~~時(shí)返回null
        //不唯一是指 multiple candidates found with none marked as primary
        public T getIfUnique() throws BeansException {
            return resolveBean(requiredType, null, true);
        }
        @Override
        public Stream<T> stream() {
            return Arrays.stream(getBeanNamesForTypedStream(requiredType))
                    .map(name -> (T) getBean(name))
                    .filter(bean -> !(bean instanceof NullBean));
        }
        @Override
        public Stream<T> orderedStream() {
            String[] beanNames = getBeanNamesForTypedStream(requiredType);
            Map<String, T> matchingBeans = new LinkedHashMap<>(beanNames.length);
            for (String beanName : beanNames) {
                Object beanInstance = getBean(beanName);
                if (!(beanInstance instanceof NullBean)) {
                    matchingBeans.put(beanName, (T) beanInstance);
                }
            }
            Stream<T> stream = matchingBeans.values().stream();
            return stream.sorted(adaptOrderComparator(matchingBeans));
        }
    };
}

resolveBean方法有多個(gè),這里為了節(jié)約篇幅只列舉一個(gè)

功能就是獲取一個(gè)bean的實(shí)例

private <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) {
        ObjectProvider<T> parentProvider = parent.getBeanProvider(requiredType);
        if (args != null) {
            return parentProvider.getObject(args);
        }
        else {
            return (nonUniqueAsNull ? parentProvider.getIfUnique() : parentProvider.getIfAvailable());
        }
    }
    return null;
}

ListableBeanFactory 方法解釋

方法的用途從名字就能看出來成翩,我就不再贅述,只是簡(jiǎn)單的列出方法赦役。

boolean containsBeanDefinition(String beanName);


int getBeanDefinitionCount();


String[] getBeanDefinitionNames();


String[] getBeanNamesForType(ResolvableType type);


String[] getBeanNamesForType(@Nullable Class<?> type);


String[] getBeanNamesForType(@Nullable Class<?> type, boolean includeNonSingletons, boolean allowEagerInit);


<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);


Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) throws BeansException;


@Nullable
<A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType)
        throws NoSuchBeanDefinitionException;

這個(gè)interface的實(shí)現(xiàn)類都會(huì)有自身的bean成員列表麻敌,具體的就有DefaultListableBeanFactory。其中的具體表現(xiàn)為:
/** Map from dependency type to corresponding autowired value. */
private final Map<Class<?>, Object> resolvableDependencies = new ConcurrentHashMap<>(16);

/** Map of bean definition objects, keyed by bean name. */
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);

/** Map of singleton and non-singleton bean names, keyed by dependency type. */
private final Map<Class<?>, String[]> allBeanNamesByType = new ConcurrentHashMap<>(64);

/** Map of singleton-only bean names, keyed by dependency type. */
private final Map<Class<?>, String[]> singletonBeanNamesByType = new ConcurrentHashMap<>(64);

/** List of bean definition names, in registration order. */
private volatile List<String> beanDefinitionNames = new ArrayList<>(256);

/** List of names of manually registered singletons, in registration order. */
private volatile Set<String> manualSingletonNames = new LinkedHashSet<>(16);

/** Cached array of bean definition names in case of frozen configuration. */
@Nullable
private volatile String[] frozenBeanDefinitionNames;

ListableBeanFactory的方法基本是根據(jù)上面的各種數(shù)據(jù)集實(shí)現(xiàn)的掂摔,目的是加快查詢的速度术羔?

HierarchicalBeanFactory

這個(gè)沒什么太多要講的,就兩個(gè)方法乙漓。自己看英語原文吧级历,開始偷懶

/**
 * Return the parent bean factory, or {@code null} if there is none.
 */
@Nullable
BeanFactory getParentBeanFactory();

/**
 * Return whether the local bean factory contains a bean of the given name,
 * ignoring beans defined in ancestor contexts.
 * <p>This is an alternative to {@code containsBean}, ignoring a bean
 * of the given name from an ancestor bean factory.
 * @param name the name of the bean to query
 * @return whether a bean with the given name is defined in the local factory
 * @see BeanFactory#containsBean
 */
boolean containsLocalBean(String name);

SingletonBeanRegistry

看名識(shí)意

//注冊(cè)單例bean
void registerSingleton(String beanName, Object singletonObject);


@Nullable
Object getSingleton(String beanName);


boolean containsSingleton(String beanName);

//獲取所有單例bean的名字
String[] getSingletonNames();


int getSingletonCount();

//Return the singleton mutex used by this registry (for external collaborators)能力有限簇秒,你們自已意會(huì)一下吧鱼喉,哈哈秀鞭。
Object getSingletonMutex();

ConfigurableBeanFactory

看名字就知道趋观,這個(gè)接口的方法主要用來對(duì)bean做各種修改扛禽。

//設(shè)置父bean實(shí)例化工廠,get方法在HierarchicalBeanFactory接口中就聲明過了
void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException;

//設(shè)置bean的類加載器
void setBeanClassLoader(@Nullable ClassLoader beanClassLoader);

//獲取bean的類加載器
@Nullable
ClassLoader getBeanClassLoader();

//
void setTempClassLoader(@Nullable ClassLoader tempClassLoader);

@Nullable
ClassLoader getTempClassLoader();

//設(shè)置是否允許緩存bean的metadata皱坛,默認(rèn)是允許
void setCacheBeanMetadata(boolean cacheBeanMetadata);

//返回是否緩存
boolean isCacheBeanMetadata();

//設(shè)置表達(dá)式解析器编曼,用于解析字符串表達(dá)式
void setBeanExpressionResolver(@Nullable BeanExpressionResolver resolver);

@Nullable
BeanExpressionResolver getBeanExpressionResolver();

//設(shè)置類型轉(zhuǎn)換器
void setConversionService(@Nullable ConversionService conversionService);

@Nullable
ConversionService getConversionService();

//設(shè)置屬性注冊(cè)(添加/修改)器
void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar);

//設(shè)置用戶自定義的屬性編輯器(單例共享,線程安全)
void registerCustomEditor(Class<?> requiredType, Class<? extends PropertyEditor> propertyEditorClass);

//用已經(jīng)注冊(cè)的編輯器去初始化入?yún)egistry
void copyRegisteredEditorsTo(PropertyEditorRegistry registry);

//設(shè)置一個(gè)類型轉(zhuǎn)換器
void setTypeConverter(TypeConverter typeConverter);

TypeConverter getTypeConverter();

//設(shè)置annotation 字符串值解析器
void addEmbeddedValueResolver(StringValueResolver valueResolver);

boolean hasEmbeddedValueResolver();

//解析value中字符串中的值
@Nullable
String resolveEmbeddedValue(String value);

//添加一個(gè)新的bean實(shí)例化前置處理器剩辟,會(huì)在bean實(shí)例化之前調(diào)用
void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);

int getBeanPostProcessorCount();

//注冊(cè)一個(gè)scope掐场,建立scopeName和scope的一個(gè)映射關(guān)系
void registerScope(String scopeName, Scope scope);

例如
[圖片上傳失敗...(image-50b833-1558969519678)]

//獲取當(dāng)前factory中已經(jīng)注冊(cè)過的所有scope的名字
String[] getRegisteredScopeNames();

//根據(jù)名字找scope
@Nullable
Scope getRegisteredScope(String scopeName);

//返回一個(gè)當(dāng)前factory可安全訪問的context
AccessControlContext getAccessControlContext();

//從otherFactory中復(fù)制所有相關(guān)的屬性到當(dāng)前factory
void copyConfigurationFrom(ConfigurableBeanFactory otherFactory);

//注冊(cè)別名
void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException;

//處理factory中所有的別名
void resolveAliases(StringValueResolver valueResolver);

//返回一個(gè)merged的bean定義對(duì)象,如果必要,會(huì)merge子類bean定義和其父類的
BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

//判斷name對(duì)應(yīng)的bean是不是factory bean
boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException;

//控制beanName對(duì)應(yīng)的bean的創(chuàng)建狀態(tài)
void setCurrentlyInCreation(String beanName, boolean inCreation);

例如[圖片上傳失敗...(image-d7a80b-1558969519678)]

//判斷bean是否在實(shí)例化
boolean isCurrentlyInCreation(String beanName);

//為bean注冊(cè)一個(gè)有依賴關(guān)系的bean
void registerDependentBean(String beanName, String dependentBeanName);

//返回所有和beanName對(duì)應(yīng)的bean有依賴關(guān)系的bean的名字
String[] getDependentBeans(String beanName);

//同上
String[] getDependenciesForBean(String beanName);

//銷毀一個(gè)bean 的實(shí)例對(duì)象贩猎,通常這個(gè)bean是prototype方式創(chuàng)建的
void destroyBean(String beanName, Object beanInstance);

//銷毀當(dāng)前scope中的bean
void destroyScopedBean(String beanName);

//銷毀當(dāng)前factory的所有單例bean
void destroySingletons();

AutowireCapableBeanFactory

//執(zhí)行所有可用的BeanPostProcessor實(shí)例化一個(gè)bean對(duì)象
<T> T createBean(Class<T> beanClass) throws BeansException;

//對(duì)于一個(gè)已經(jīng)實(shí)例化的bean執(zhí)行after-instantiation的回調(diào)方法
void autowireBean(Object existingBean) throws BeansException;

//配置bean的變量值熊户,執(zhí)行factory的各種回調(diào)方法和post processor方法
Object configureBean(Object existingBean, String beanName) throws BeansException;


//-------------------------------------------------------------------------
// Specialized methods for fine-grained control over the bean lifecycle
//-------------------------------------------------------------------------

//autowire方式實(shí)例化bean
Object createBean(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;

//autowire方式實(shí)例化bean
Object autowire(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;

//autowire方式裝載已經(jīng)實(shí)例化的bean的各種屬性
void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck)
        throws BeansException;

//用beanName對(duì)應(yīng)的beanDefination對(duì)象參數(shù)配置已經(jīng)實(shí)例化的existingBean
void applyBeanPropertyValues(Object existingBean, String beanName) throws BeansException;

//對(duì)已經(jīng)存在的bean執(zhí)行初始化操作
Object initializeBean(Object existingBean, String beanName) throws BeansException;

//對(duì)已存在的bean實(shí)例執(zhí)行PostProcessor方法,在初始化之前
Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
        throws BeansException;

//對(duì)已存在的bean實(shí)例執(zhí)行PostProcessor方法吭服,在初始化之后
Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
        throws BeansException;

//銷毀一個(gè)已存在的bean對(duì)象
void destroyBean(Object existingBean);


//-------------------------------------------------------------------------
// Delegate methods for resolving injection points
//-------------------------------------------------------------------------

//getBean(Class)方法的變形
<T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType) throws BeansException;

//根據(jù)此工廠中定義的bean解析指定的依賴項(xiàng)
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;

先做到這里吧嚷堡,篇幅太長(zhǎng)看的難受

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市艇棕,隨后出現(xiàn)的幾起案子蝌戒,更是在濱河造成了極大的恐慌,老刑警劉巖沼琉,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件北苟,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡打瘪,警方通過查閱死者的電腦和手機(jī)友鼻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瑟慈,“玉大人桃移,你說我怎么就攤上這事「鸨蹋” “怎么了借杰?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)进泼。 經(jīng)常有香客問我蔗衡,道長(zhǎng),這世上最難降的妖魔是什么乳绕? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任绞惦,我火速辦了婚禮,結(jié)果婚禮上洋措,老公的妹妹穿的比我還像新娘济蝉。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布王滤。 她就那樣靜靜地躺著贺嫂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪雁乡。 梳的紋絲不亂的頭發(fā)上第喳,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音踱稍,去河邊找鬼曲饱。 笑死,一個(gè)胖子當(dāng)著我的面吹牛珠月,可吹牛的內(nèi)容都是我干的扩淀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼啤挎,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼引矩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起侵浸,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤旺韭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后掏觉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體区端,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年澳腹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了织盼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡酱塔,死狀恐怖沥邻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情羊娃,我是刑警寧澤唐全,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站蕊玷,受9級(jí)特大地震影響邮利,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜垃帅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一延届、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贸诚,春花似錦方庭、人聲如沸厕吉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赴涵。三九已至,卻和暖如春订讼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背扇苞。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工欺殿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鳖敷。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓脖苏,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親定踱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子棍潘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容