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

Java DefaultListableBeanFactory接口超詳細介紹

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

前言

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

默認的工廠實現(xiàn)為DefaultListableBeanFactory

類圖

AliasRegistry

功能是實現(xiàn)對一個bean注冊多個不同的別名

例如

@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注冊管理接口,支持4個api,分別是注冊alias、刪除alias、獲取alias、判斷指定名稱是否是alias。AliasRegistry該接口層次在spring中非常高,因而是非?;A的一個接口。繼承此接口需要實現(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中維護aliasMap

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

判斷循環(huán)引用,如果存在 alias, name和name, alias同時存在,拋出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();
}

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

實現(xiàn)類

DefaultSingletonBeanRegistry

先看大名鼎鼎的三級緩存

        /*存放已經(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實例,還未完全初始化*/
	private final Map<String, Object> earlySingletonObjects = new ConcurrentHashMap<>(16);

注冊單例接口

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

如果直接把生成好的實例,那么直接放入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);
			}
		}
	}

三級緩存發(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中獲取實例

如都獲取不到鎖住singletonObjects再次讀一遍,如果沒有其他線程修改,通過singletonFactory生成對象,放入

earlySingletonObjects并從singletonFactories中移除

FactoryBeanRegistrySupport

提供對factoryBean接口的支持。

FactoryBean是什么?

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

FactoryBean

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

關鍵方法,調用FactoryBean的getObject生成bean實例

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

AbstractBeanFactory

來到AbstractBeanFactory。基本沒有擴展新的功能接口,這個類的主要對繼承的接口有了個大概的實現(xiàn),整個工廠大部分實現(xiàn)都在這里

AbstractAutowireCapableBeanFactory

AbstractAutowireCapableBeanFactory在AbstractBeanFactory的基礎上又擴展了,Autowire功能

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

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

例如org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#autowire進行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個忽略自動裝配的的方法。

2、1個注冊一個可分解依賴的方法。

3、1個判斷指定的Bean是否有資格作為自動裝配的候選者的方法。

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

5、2個凍結所有的Bean配置相關的方法。

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

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

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

相關文章

  • springboot中如何使用openfeign進行接口調用

    springboot中如何使用openfeign進行接口調用

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

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

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

    SpringBoot Security安裝配置及Thymeleaf整合

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

    RocketMQ消息中間件超詳細解讀

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

    Java精品項目瑞吉外賣之員工新增篇

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

    Java中動態(tài)地改變數(shù)組長度及數(shù)組轉Map的代碼實例分享

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

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

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

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

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

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

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

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

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

最新評論

彰武县| 文水县| 紫云| 永宁县| 彭山县| 蒲江县| 牙克石市| 大石桥市| 五华县| 昌黎县| 寻乌县| 留坝县| 武安市| 牙克石市| 新邵县| 新丰县| 应用必备| 神农架林区| 沈阳市| 新巴尔虎右旗| 教育| 云林县| 巴南区| 荃湾区| 左权县| 台南县| 通城县| 桂东县| 新河县| 微博| 得荣县| 巴彦淖尔市| 湖州市| 诏安县| 铁岭市| 区。| 南昌市| 子长县| 祁东县| 阿克苏市| 平度市|