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

SpringBoot?spring.factories加載時(shí)機(jī)分析

 更新時(shí)間:2023年03月13日 15:30:06   作者:石臻臻的雜貨鋪  
這篇文章主要為大家介紹了SpringBoot?spring.factories加載時(shí)機(jī)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

spring.factories作用

這個(gè)類似于Java中的SPI功能,SpringBoot啟動(dòng)的時(shí)候會(huì)讀取所有jar包下面的META-INF/spring.factories文件;

并且將文件中的 接口/抽象類 對(duì)應(yīng)的實(shí)現(xiàn)類都對(duì)應(yīng)起來,并在需要的時(shí)候可以實(shí)例化對(duì)應(yīng)的實(shí)現(xiàn)類

下面我們來分析一下源碼看看spring.factories的使用場(chǎng)景

源碼解析

啟動(dòng)SpringApplication,看看構(gòu)造方法

	public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
		this.resourceLoader = resourceLoader;
		Assert.notNull(primarySources, "PrimarySources must not be null");
		this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
		this.webApplicationType = WebApplicationType.deduceFromClasspath();
		setInitializers((Collection) getSpringFactoriesInstances(
				ApplicationContextInitializer.class));
		setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
		this.mainApplicationClass = deduceMainApplicationClass();
	}

其中方法getSpringFactoriesInstances( ApplicationContextInitializer.class) 是用于獲取Spring中指定類實(shí)例用的;并且獲取的時(shí)候是根據(jù)讀取整個(gè)項(xiàng)目中文件路徑為META-INF/spring.factories 中的內(nèi)容實(shí)例化對(duì)應(yīng)的實(shí)例類的;

例如這里的ApplicationContextInitializer 是一個(gè)接口,那么應(yīng)該實(shí)例化哪些他的實(shí)現(xiàn)類呢?那就找META-INF/spring.factories文件 ; 那么我們?cè)?code>spring-boot:2.1.0jar包中找到了這個(gè)文件

讀取到需要實(shí)例化的實(shí)現(xiàn)類為

org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer,\
org.springframework.boot.context.ContextIdApplicationContextInitializer,\
org.springframework.boot.context.config.DelegatingApplicationContextInitializer,\
org.springframework.boot.web.context.ServerPortInfoApplicationContextInitializer

并且還在spring-boot-autoconfigure-2.1.0.RELEASE.jar中找到了這個(gè)文件

那么文件中的兩個(gè)實(shí)現(xiàn)類也會(huì)被實(shí)例化;加上上面4個(gè)總共有6個(gè)

org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\
org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener

可以看到不僅僅只是把org.springframework.context.ApplicationContextInitializer 的實(shí)例類解析了出來;而是所有的都解析了出來并且保存下來了.下次其他的類需要被實(shí)例化的時(shí)候就可以直接從內(nèi)存里面拿了;

上面過程拿到了實(shí)例類之后,接下來就是實(shí)例化的過程了

	private <T> Collection<T> getSpringFactoriesInstances(Class<T> type,
			Class<?>[] parameterTypes, Object... args) {
		ClassLoader classLoader = getClassLoader();
		// Use names and ensure unique to protect against duplicates
		Set<String> names = new LinkedHashSet<>(
				SpringFactoriesLoader.loadFactoryNames(type, classLoader));
		List<T> instances = createSpringFactoriesInstances(type, parameterTypes,
				classLoader, args, names);
		AnnotationAwareOrderComparator.sort(instances);
		return instances;
	}

方法createSpringFactoriesInstances就是創(chuàng)建實(shí)例的過程;可以看到傳入了對(duì)應(yīng)的接口類org.springframework.context.ApplicationContextInitializer ;接下來就會(huì)實(shí)例化 上面找到了對(duì)應(yīng)的實(shí)現(xiàn)類;

	private <T> List<T> createSpringFactoriesInstances(Class<T> type,
			Class<?>[] parameterTypes, ClassLoader classLoader, Object[] args,
			Set<String> names) {
		List<T> instances = new ArrayList<>(names.size());
		for (String name : names) {
			try {
				Class<?> instanceClass = ClassUtils.forName(name, classLoader);
				Assert.isAssignable(type, instanceClass);
				Constructor<?> constructor = instanceClass
						.getDeclaredConstructor(parameterTypes);
				T instance = (T) BeanUtils.instantiateClass(constructor, args);
				instances.add(instance);
			}
			catch (Throwable ex) {
				throw new IllegalArgumentException(
						"Cannot instantiate " + type + " : " + name, ex);
			}
		}
		return instances;
	}

實(shí)例化的過程如果,沒有什么特別需要講解的;

上面有個(gè)方法 AnnotationAwareOrderComparator.sort(instances);是用來排序所有實(shí)例的; 實(shí)現(xiàn)類需要實(shí)現(xiàn) 接口Ordered ; getOrder返回的值越小,優(yōu)先級(jí)更高

用法

知道spring.factories的用法之后, 那么我們就可以利用這個(gè)特性實(shí)現(xiàn)自己的目的;

例如我們也可以寫一個(gè)接口類ApplicationContextInitializer的實(shí)現(xiàn)類;

等等之類的;

以上就是SpringBoot spring.factories加載時(shí)機(jī)分析的詳細(xì)內(nèi)容,更多關(guān)于spring.factories加載時(shí)機(jī)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用MDC實(shí)現(xiàn)日志鏈路跟蹤

    使用MDC實(shí)現(xiàn)日志鏈路跟蹤

    這篇文章主要介紹了使用MDC實(shí)現(xiàn)日志鏈路跟蹤,在微服務(wù)環(huán)境中,我們經(jīng)常使用Skywalking、CAT等去實(shí)現(xiàn)整體請(qǐng)求鏈路的追蹤,但是這個(gè)整體運(yùn)維成本高,架構(gòu)復(fù)雜,我們來使用MDC通過Log來實(shí)現(xiàn)一個(gè)輕量級(jí)的會(huì)話事務(wù)跟蹤功能,下面就來看看具體的過程吧,需要的朋友可以參考一下
    2022-01-01
  • 匯總Java中List 去重的 6 種方法

    匯總Java中List 去重的 6 種方法

    這篇文章主要介紹了匯總Java中List 去重的 6 種方法,文章圍繞主題展開List去重的方法,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-05-05
  • java實(shí)現(xiàn) 二叉搜索樹功能

    java實(shí)現(xiàn) 二叉搜索樹功能

    這篇文章主要介紹了java實(shí)現(xiàn) 二叉搜索樹功能,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-07-07
  • java自旋鎖和JVM對(duì)鎖的優(yōu)化詳解

    java自旋鎖和JVM對(duì)鎖的優(yōu)化詳解

    這篇文章主要為大家介紹了java自旋鎖和JVM對(duì)鎖的優(yōu)化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 詳解RabbitMQ中延遲隊(duì)列結(jié)合業(yè)務(wù)場(chǎng)景的使用

    詳解RabbitMQ中延遲隊(duì)列結(jié)合業(yè)務(wù)場(chǎng)景的使用

    這篇文章主要介紹了詳解RabbitMQ中延遲隊(duì)列結(jié)合業(yè)務(wù)場(chǎng)景的使用,延遲隊(duì)列中的元素都是帶有時(shí)間屬性的,延遲隊(duì)列就是用來存放需要在指定時(shí)間被處理的元素的隊(duì)列,需要的朋友可以參考下
    2023-05-05
  • 舉例講解Java中Piped管道輸入輸出流的線程通信控制

    舉例講解Java中Piped管道輸入輸出流的線程通信控制

    Java中的PipedWriter、PipedReader類管道的讀寫依賴于PipedOutputStream、PipedInputStream兩個(gè)管道輸入輸出類,這里我們將來舉例講解Java中Piped管道輸入輸出流的線程通信控制:
    2016-06-06
  • Springboot如何設(shè)置過濾器及重復(fù)讀取request里的body

    Springboot如何設(shè)置過濾器及重復(fù)讀取request里的body

    這篇文章主要介紹了Springboot如何設(shè)置過濾器及重復(fù)讀取request里的body,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java動(dòng)態(tài)線程池插件dynamic-tp集成zookeeper

    Java動(dòng)態(tài)線程池插件dynamic-tp集成zookeeper

    ZooKeeper是一個(gè)分布式的,開放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù),是Google的Chubby一個(gè)開源的實(shí)現(xiàn),是Hadoop和Hbase的重要組件。它是一個(gè)為分布式應(yīng)用提供一致性的軟件,提供的功能包括:配置維護(hù)、域名服務(wù)、分布式同步、組服務(wù)等
    2023-03-03
  • Idea安裝bpmn插件actiBPM的詳細(xì)過程(解決高版本無法安裝actiBPM插件)

    Idea安裝bpmn插件actiBPM的詳細(xì)過程(解決高版本無法安裝actiBPM插件)

    這篇文章主要介紹了Idea安裝bpmn插件actiBPM的詳細(xì)過程(解決高版本無法安裝actiBPM插件)的問題,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-01-01
  • maven導(dǎo)入無法拉取所需依賴的解決方法

    maven導(dǎo)入無法拉取所需依賴的解決方法

    最近遇到個(gè)問題maven導(dǎo)入無法拉取所需依賴的解決方法,本文就來詳細(xì)的介紹一下解決方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02

最新評(píng)論

丹江口市| 太和县| 清苑县| 临澧县| 仪陇县| 桐柏县| 广安市| 浑源县| 池州市| 翁源县| 叶城县| 阳高县| 老河口市| 甘肃省| 浏阳市| 贵州省| 通辽市| 句容市| 延吉市| 交城县| 长宁区| 肇庆市| 隆德县| 遵义县| 长岛县| 侯马市| 盈江县| 涟源市| 郧西县| 郓城县| 高邮市| 延安市| 合作市| 灯塔市| 甘孜县| 伊金霍洛旗| 蒙自县| 堆龙德庆县| 东乡族自治县| 黑龙江省| 巩留县|