最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java DefaultListableBeanFactory接口超詳細(xì)介紹

 更新時(shí)間:2022年11月18日 09:19:02   作者:氵奄不死的魚  
這篇文章主要介紹了Java DefaultListableBeanFactory接口,DefaultListableBeanFactory是整個(gè)bean加載的核心部分,是Spring注冊(cè)機(jī)加載bean的默認(rèn)實(shí)現(xiàn)

前言

本文,對(duì)bean工廠的接口做分析梳理具體實(shí)現(xiàn)不研究

默認(rèn)的工廠實(shí)現(xiàn)為DefaultListableBeanFactory

類圖

AliasRegistry

功能是實(shí)現(xiàn)對(duì)一個(gè)bean注冊(cè)多個(gè)不同的別名

例如

@Component
public class AliasConfiguration implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        beanFactory.registerAlias("originalBeanName", "newAlias");
        beanFactory.registerAlias("originalBeanName", "newAlias2");
        beanFactory.registerAlias("otherOriginalBeanName", "newAlias3");
    }
}

接口

public interface AliasRegistry {
	void registerAlias(String name, String alias);
	void removeAlias(String alias);
	boolean isAlias(String name);
	String[] getAliases(String name);
}

AliasRegistry接口是alias注冊(cè)管理接口,支持4個(gè)api,分別是注冊(cè)alias、刪除alias、獲取alias、判斷指定名稱是否是alias。AliasRegistry該接口層次在spring中非常高,因而是非?;A(chǔ)的一個(gè)接口。繼承此接口需要實(shí)現(xiàn)別名

SimpleAliasRegistry

@Override
	public void registerAlias(String name, String alias) {
		Assert.hasText(name, "'name' must not be empty");
		Assert.hasText(alias, "'alias' must not be empty");
		synchronized (this.aliasMap) {
			if (alias.equals(name)) {
				this.aliasMap.remove(alias);
				if (logger.isDebugEnabled()) {
					logger.debug("Alias definition '" + alias + "' ignored since it points to same name");
				}
			}
			else {
				String registeredName = this.aliasMap.get(alias);
				if (registeredName != null) {
					if (registeredName.equals(name)) {
						// An existing alias - no need to re-register
						return;
					}
					if (!allowAliasOverriding()) {
						throw new IllegalStateException("Cannot define alias '" + alias + "' for name '" +
								name + "': It is already registered for name '" + registeredName + "'.");
					}
					if (logger.isDebugEnabled()) {
						logger.debug("Overriding alias '" + alias + "' definition for registered name '" +
								registeredName + "' with new target name '" + name + "'");
					}
				}
				checkForAliasCircle(name, alias);
				this.aliasMap.put(alias, name);
				if (logger.isTraceEnabled()) {
					logger.trace("Alias definition '" + alias + "' registered for name '" + name + "'");
				}
			}
		}
	}

SimpleAliasRegistry中維護(hù)aliasMap

如果存在重名,判斷是否允許覆蓋

判斷循環(huán)引用,如果存在 alias, name和name, alias同時(shí)存在,拋出Circular reference異常

SingletonBeanRegistry

public interface SingletonBeanRegistry {
	void registerSingleton(String beanName, Object singletonObject);
	@Nullable
	Object getSingleton(String beanName);
	boolean containsSingleton(String beanName);
	String[] getSingletonNames();
	int getSingletonCount();
	Object getSingletonMutex();
}

注冊(cè)獲取單例接口具體實(shí)現(xiàn)

實(shí)現(xiàn)類

DefaultSingletonBeanRegistry

先看大名鼎鼎的三級(jí)緩存

        /*存放已經(jīng)完成創(chuàng)建的bean  */
	private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
	/** 存放存放生成bean的工廠,生成bean后先放入earlySingletonObjects */
	private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);
    /*存放提前暴露的bean實(shí)例,還未完全初始化*/
	private final Map<String, Object> earlySingletonObjects = new ConcurrentHashMap<>(16);

注冊(cè)單例接口

org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#registerSingleton

@Override
	public void registerSingleton(String beanName, Object singletonObject) throws IllegalStateException {
		Assert.notNull(beanName, "Bean name must not be null");
		Assert.notNull(singletonObject, "Singleton object must not be null");
		synchronized (this.singletonObjects) {
			Object oldObject = this.singletonObjects.get(beanName);
			if (oldObject != null) {
				throw new IllegalStateException("Could not register object [" + singletonObject +
						"] under bean name '" + beanName + "': there is already object [" + oldObject + "] bound");
			}
			addSingleton(beanName, singletonObject);
		}
	}
protected void addSingleton(String beanName, Object singletonObject) {
		synchronized (this.singletonObjects) {
			this.singletonObjects.put(beanName, singletonObject);
			this.singletonFactories.remove(beanName);
			this.earlySingletonObjects.remove(beanName);
			this.registeredSingletons.add(beanName);
		}
	}

如果直接把生成好的實(shí)例,那么直接放入singletonObjects中,并且name放入registeredSingletons

如果需要提交暴露

org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#addSingletonFactory

protected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory) {
		Assert.notNull(singletonFactory, "Singleton factory must not be null");
		synchronized (this.singletonObjects) {
			if (!this.singletonObjects.containsKey(beanName)) {
				this.singletonFactories.put(beanName, singletonFactory);
				this.earlySingletonObjects.remove(beanName);
				this.registeredSingletons.add(beanName);
			}
		}
	}

三級(jí)緩存發(fā)揮作用

org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String, boolean)

@Nullable
	protected Object getSingleton(String beanName, boolean allowEarlyReference) {
		// Quick check for existing instance without full singleton lock
		Object singletonObject = this.singletonObjects.get(beanName);
		if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
			singletonObject = this.earlySingletonObjects.get(beanName);
			if (singletonObject == null && allowEarlyReference) {
				synchronized (this.singletonObjects) {
					// Consistent creation of early reference within full singleton lock
					singletonObject = this.singletonObjects.get(beanName);
					if (singletonObject == null) {
						singletonObject = this.earlySingletonObjects.get(beanName);
						if (singletonObject == null) {
							ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
							if (singletonFactory != null) {
								singletonObject = singletonFactory.getObject();
								this.earlySingletonObjects.put(beanName, singletonObject);
								this.singletonFactories.remove(beanName);
							}
						}
					}
				}
			}
		}
		return singletonObject;
	}

分別嘗試從singletonObjects和earlySingletonObjects中獲取實(shí)例

如都獲取不到鎖住singletonObjects再次讀一遍,如果沒(méi)有其他線程修改,通過(guò)singletonFactory生成對(duì)象,放入

earlySingletonObjects并從singletonFactories中移除

FactoryBeanRegistrySupport

提供對(duì)factoryBean接口的支持。

FactoryBean是什么?

FactoryBean接口的作用在bean工工廠上。是對(duì)bean進(jìn)行自定義實(shí)例化,可以認(rèn)為是方法工廠模式。spring默認(rèn)的工廠,生產(chǎn)所有的實(shí)例的方式都相同,而FactoryBean.getObject可以自定義這個(gè)方式

FactoryBean

public interface FactoryBean<T> {
	String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType";
	@Nullable
	T getObject() throws Exception;
	@Nullable
	Class<?> getObjectType();
	default boolean isSingleton() {
		return true;
	}
}

關(guān)鍵方法,調(diào)用FactoryBean的getObject生成bean實(shí)例

private Object doGetObjectFromFactoryBean(FactoryBean<?> factory, String beanName) throws BeanCreationException {
		Object object;
    ······················
		object = factory.getObject();
	·····················
		return object;
	}

AbstractBeanFactory

來(lái)到AbstractBeanFactory?;緵](méi)有擴(kuò)展新的功能接口,這個(gè)類的主要對(duì)繼承的接口有了個(gè)大概的實(shí)現(xiàn),整個(gè)工廠大部分實(shí)現(xiàn)都在這里

AbstractAutowireCapableBeanFactory

AbstractAutowireCapableBeanFactory在AbstractBeanFactory的基礎(chǔ)上又?jǐn)U展了,Autowire功能

這個(gè)工廠接口繼承自BeanFacotory,它擴(kuò)展了自動(dòng)裝配的功能,根據(jù)類定義BeanDefinition裝配Bean、執(zhí)行前、后處理器等。

AutowireCapableBeanFactory的具體實(shí)現(xiàn)都在AbstractAutowireCapableBeanFactory

例如org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#autowire進(jìn)行bean的注入

BeanDefinitionRegistry

BeanDefinition的一些操作接口

public interface BeanDefinitionRegistry extends AliasRegistry {
	void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
			throws BeanDefinitionStoreException;
	void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
	BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
	boolean containsBeanDefinition(String beanName);
	String[] getBeanDefinitionNames();
	int getBeanDefinitionCount();
	boolean isBeanNameInUse(String beanName);
}

ConfigurableListableBeanFactory

ConfigurableListableBeanFactory具體:

1、2個(gè)忽略自動(dòng)裝配的的方法。

2、1個(gè)注冊(cè)一個(gè)可分解依賴的方法。

3、1個(gè)判斷指定的Bean是否有資格作為自動(dòng)裝配的候選者的方法。

4、1個(gè)根據(jù)指定bean名,返回注冊(cè)的Bean定義的方法。

5、2個(gè)凍結(jié)所有的Bean配置相關(guān)的方法。

6、1個(gè)使所有的非延遲加載的單例類都實(shí)例化的方法(preInstantiateSingletons)。

總結(jié):工廠接口ConfigurableListableBeanFactory同時(shí)繼承了3個(gè)接口,ListableBeanFactory、AutowireCapableBeanFactory 和 ConfigurableBeanFactory,擴(kuò)展之后,加上自有的這8個(gè)方法,這個(gè)工廠接口總共有83個(gè)方法,實(shí)在是巨大到不行了。這個(gè)工廠接口的自有方法總體上只是對(duì)父類接口功能的補(bǔ)充,包含了BeanFactory體系目前的所有方法。

到此這篇關(guān)于Java DefaultListableBeanFactory接口超詳細(xì)介紹的文章就介紹到這了,更多相關(guān)Java DefaultListableBeanFactory內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot中如何使用openfeign進(jìn)行接口調(diào)用

    springboot中如何使用openfeign進(jìn)行接口調(diào)用

    這篇文章主要介紹了springboot中如何使用openfeign進(jìn)行接口調(diào)用問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java源碼解析HashMap的keySet()方法

    Java源碼解析HashMap的keySet()方法

    今天小編就為大家分享一篇關(guān)于Java源碼解析HashMap的keySet()方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • SpringBoot Security安裝配置及Thymeleaf整合

    SpringBoot Security安裝配置及Thymeleaf整合

    這篇文章主要介紹了SpringBoot Security安裝配置及Thymeleaf整合,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • RocketMQ消息中間件超詳細(xì)解讀

    RocketMQ消息中間件超詳細(xì)解讀

    這篇文章主要介紹了RocketMQ消息中間件超詳細(xì)解讀,RocketMQ作為一款純java、分布式、隊(duì)列模型的開(kāi)源消息中間件,支持事務(wù)消息、順序消息、批量消息、定時(shí)消息、消息回溯等,本文就來(lái)詳細(xì)解讀一下,需要的朋友可以參考下
    2023-05-05
  • Java精品項(xiàng)目瑞吉外賣之員工新增篇

    Java精品項(xiàng)目瑞吉外賣之員工新增篇

    這篇文章主要為大家詳細(xì)介紹了java精品項(xiàng)目-瑞吉外賣訂餐系統(tǒng),此項(xiàng)目過(guò)大,分為多章獨(dú)立講解,本篇內(nèi)容為新增員工功能的實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Java中動(dòng)態(tài)地改變數(shù)組長(zhǎng)度及數(shù)組轉(zhuǎn)Map的代碼實(shí)例分享

    Java中動(dòng)態(tài)地改變數(shù)組長(zhǎng)度及數(shù)組轉(zhuǎn)Map的代碼實(shí)例分享

    這篇文章主要介紹了Java中動(dòng)態(tài)地改變數(shù)組長(zhǎng)度及數(shù)組轉(zhuǎn)map的代碼分享,其中轉(zhuǎn)Map利用到了java.util.Map接口,需要的朋友可以參考下
    2016-03-03
  • Flowable整合SpringBoot實(shí)現(xiàn)的示例代碼

    Flowable整合SpringBoot實(shí)現(xiàn)的示例代碼

    本文詳細(xì)介紹了如何在SpringBoot項(xiàng)目中整合Flowable進(jìn)行工作流管理,包括依賴引入、流程部署與啟動(dòng)、表結(jié)構(gòu)、流程掛起和激活以及任務(wù)分配等關(guān)鍵操作,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-09-09
  • SpringBoot添加自定義攔截器的實(shí)現(xiàn)代碼

    SpringBoot添加自定義攔截器的實(shí)現(xiàn)代碼

    這篇文章主要介紹了SpringBoot添加自定義攔截器的實(shí)現(xiàn)代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-09-09
  • Java輕松入門冒泡?選擇?插入?希爾?歸并排序算法

    Java輕松入門冒泡?選擇?插入?希爾?歸并排序算法

    這篇文章主要介紹了Java常用的排序算法及代碼實(shí)現(xiàn),在Java開(kāi)發(fā)中,對(duì)排序的應(yīng)用需要熟練的掌握,這樣才能夠確保Java學(xué)習(xí)時(shí)候能夠有扎實(shí)的基礎(chǔ)能力。那Java有哪些排序算法呢?本文小編就來(lái)詳細(xì)說(shuō)說(shuō)Java常見(jiàn)的排序算法,需要的朋友可以參考一下
    2022-02-02
  • Properties操作如何保存到屬性文件

    Properties操作如何保存到屬性文件

    這篇文章主要介紹了Properties操作保存到屬性文件的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06

最新評(píng)論

泸水县| 永定县| 惠东县| 平远县| 宜都市| 资源县| 阿拉善盟| 宁乡县| 古浪县| 西和县| 克拉玛依市| 乐东| 武城县| 沁阳市| 青河县| 乌兰浩特市| 诸城市| 郯城县| 东丽区| 泗水县| 隆回县| 海丰县| 大渡口区| 兴化市| 眉山市| 广元市| 胶州市| 纳雍县| 根河市| 龙井市| 册亨县| 临沧市| 正镶白旗| 依兰县| 章丘市| 柘城县| 阿坝县| 洪湖市| 印江| 绍兴县| 商都县|