日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Spring FactoriesLoader機(jī)制實(shí)例詳解

瀏覽:151日期:2023-09-16 10:06:46

一、SpringFactoriesLoader 介紹

1.1 SpringFactoriesLoader 簡(jiǎn)介

SpringFactoriesLoader 工廠(chǎng)加載機(jī)制是 Spring 內(nèi)部提供的一個(gè)約定俗成的加載方式,與 java spi 類(lèi)似,只需要在模塊的 META-INF/spring.factories 文件中,以 Properties 類(lèi)型(即 key-value 形式)配置,就可以將相應(yīng)的實(shí)現(xiàn)類(lèi)注入 Spirng 容器中。

Properties 類(lèi)型格式:

key:是全限定名(抽象類(lèi)|接口)

value:是實(shí)現(xiàn),多個(gè)實(shí)現(xiàn)通過(guò) **逗號(hào)** 進(jìn)行分隔

1.2 SpringFactoriesLoader 常用方法

loadFactoryNames

讀取 classpath上 所有的 jar 包中的所有 META-INF/spring.factories屬 性文件,找出其中定義的匹配類(lèi)型 factoryClass 的工廠(chǎng)類(lèi),然后并返回這些工廠(chǎng)類(lèi)的名字列表,注意是包含包名的全限定名。loadFactories

讀取 classpath 上所有的jar包中的所有 META-INF/spring.factories 屬性文件,找出其中定義的匹配類(lèi)型 factoryClass 的工廠(chǎng)類(lèi),然后創(chuàng)建每個(gè)工廠(chǎng)類(lèi)的對(duì)象/實(shí)例,并返回這些工廠(chǎng)類(lèi)對(duì)象/實(shí)例的列表。

1.3 loadFactories 流程圖

Spring FactoriesLoader機(jī)制實(shí)例詳解

二、SpringFactoriesLoader 源碼解析

2.1 loadFactoryNames 解析

public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) { // 獲取包含包名的工廠(chǎng)類(lèi)名稱(chēng) String factoryTypeName = factoryType.getName(); // 獲取所有配置在 META-INF/spring.factories 文件的值 // 然后獲取指定類(lèi)的實(shí)現(xiàn)類(lèi)名列表 return loadSpringFactories(classLoader).getOrDefault(factoryTypeName, Collections.emptyList());}

// 默認(rèn)的工廠(chǎng)配置路徑地址,可以存放在多個(gè) JAR 包下public static final String FACTORIES_RESOURCE_LOCATION = 'META-INF/spring.factories';private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) { // 判斷是否有緩存結(jié)果,如果有直接返回 MultiValueMap<String, String> result = cache.get(classLoader); if (result != null) { return result; } try { // 掃描 classpath 上所有 JAR 中的文件 META-INF/spring.factories Enumeration<URL> urls = (classLoader != null ?classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION)); result = new LinkedMultiValueMap<>(); while (urls.hasMoreElements()) { // 找到的每個(gè) META-INF/spring.factories 文件都是一個(gè) Properties 文件,將其內(nèi)容加載到一個(gè) Properties 對(duì)象然后處理其中的每個(gè)屬性 URL url = urls.nextElement(); UrlResource resource = new UrlResource(url); Properties properties = PropertiesLoaderUtils.loadProperties(resource); for (Map.Entry<?, ?> entry : properties.entrySet()) {// 獲取工廠(chǎng)類(lèi)名稱(chēng)(接口或者抽象類(lèi)的全限定名)String factoryTypeName = ((String) entry.getKey()).trim();// 將逗號(hào)分割的屬性值逐個(gè)取出,然后放到 結(jié)果result 中去for (String factoryImplementationName : StringUtils.commaDelimitedListToStringArray((String) entry.getValue())) { result.add(factoryTypeName, factoryImplementationName.trim());} } } // 將結(jié)果存放到緩存中 cache.put(classLoader, result); return result; } catch (IOException ex) { throw new IllegalArgumentException('Unable to load factories from location [' +FACTORIES_RESOURCE_LOCATION + ']', ex); }}

default V getOrDefault(Object key, V defaultValue) { V v; return (((v = get(key)) != null) || containsKey(key)) ? v : defaultValue;}

2.2 loadFactories 解析

public static <T> List<T> loadFactories(Class<T> factoryType, @Nullable ClassLoader classLoader) { Assert.notNull(factoryType, '’factoryType’ must not be null'); // 如果未指定類(lèi)加載器,則使用默認(rèn)的 ClassLoader classLoaderToUse = classLoader; if (classLoaderToUse == null) { classLoaderToUse = SpringFactoriesLoader.class.getClassLoader(); } // 獲取指定工廠(chǎng)名稱(chēng)列表 List<String> factoryImplementationNames = loadFactoryNames(factoryType, classLoaderToUse); // 如果記錄器Trace跟蹤激活的話(huà),將工廠(chǎng)名稱(chēng)列表輸出 if (logger.isTraceEnabled()) { logger.trace('Loaded [' + factoryType.getName() + '] names: ' + factoryImplementationNames); } // 創(chuàng)建結(jié)果集 List<T> result = new ArrayList<>(factoryImplementationNames.size()); for (String factoryImplementationName : factoryImplementationNames) { // 實(shí)例化工廠(chǎng)類(lèi),并添加到結(jié)果集中 result.add(instantiateFactory(factoryImplementationName, factoryType, classLoaderToUse)); } // 對(duì)結(jié)果集列表進(jìn)行排序 AnnotationAwareOrderComparator.sort(result); return result;}

private static <T> T instantiateFactory(String factoryImplementationName, Class<T> factoryType, ClassLoader classLoader) { try { Class<?> factoryImplementationClass = ClassUtils.forName(factoryImplementationName, classLoader); if (!factoryType.isAssignableFrom(factoryImplementationClass)) { throw new IllegalArgumentException( 'Class [' + factoryImplementationName + '] is not assignable to factory type [' + factoryType.getName() + ']'); } return (T) ReflectionUtils.accessibleConstructor(factoryImplementationClass).newInstance(); } catch (Throwable ex) { throw new IllegalArgumentException( 'Unable to instantiate factory class [' + factoryImplementationName + '] for factory type [' + factoryType.getName() + ']', ex); }}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
精品一区三区| 中文精品电影| 美女久久一区| 免费视频久久| 日韩在线播放一区二区| 欧美女激情福利| 99在线|亚洲一区二区| 91成人精品视频| 首页欧美精品中文字幕| 香蕉久久一区| 国产精品久久久久久久久久齐齐 | 国产+成+人+亚洲欧洲在线| 91日韩免费| 999久久久国产精品| 久久亚洲不卡| 91在线成人| 日韩高清成人| 亚洲小说春色综合另类电影| 国产乱码精品一区二区三区四区 | 精品国产午夜肉伦伦影院| 美女福利一区二区三区| 蜜桃成人av| 婷婷精品在线| 国产成人精选| 丝袜亚洲精品中文字幕一区| 日本国产亚洲| 日韩精品dvd| 亚洲人妖在线| 中文字幕在线官网| 蜜桃久久av| 精品国产欧美日韩| 天堂成人国产精品一区| 另类小说一区二区三区| 中国女人久久久| 精品国内亚洲2022精品成人| 亚洲国产一区二区在线观看| 日韩精品一二区| 精品一区av| 亚洲精品第一| 精品欧美一区二区三区在线观看| 亚洲久草在线| 日韩毛片视频| 国产免费av一区二区三区| 不卡在线一区二区| 免费在线日韩av| 亚洲一区二区小说| 国产91久久精品一区二区| 国产亚洲电影| 水蜜桃久久夜色精品一区的特点| 国产精品精品国产一区二区| 日韩免费精品| 91视频一区| 日韩精品久久理论片| 激情婷婷综合| 成人在线丰满少妇av| 亚洲91在线| 国产一区二区三区自拍| 激情综合五月| 国产精品一区二区三区av麻| 美女尤物久久精品| 欧美日韩国产传媒| 麻豆理论在线观看| 麻豆国产一区| 国产日韩中文在线中文字幕| 免费精品视频| 欧美日韩国产高清| 国产成人免费| 国产欧美二区| 国产日产精品一区二区三区四区的观看方式 | 国产精品片aa在线观看| 一区二区三区四区精品视频| 亚洲精品在线观看91| 日韩久久电影| 精品国产乱码久久久久久1区2匹| 国产亚洲人成a在线v网站| 亚洲精品国产日韩| 欧美特黄一区| 欧美日韩一区二区三区视频播放| 国产乱码精品一区二区亚洲| 亚洲3区在线| 亚洲一区av| 亚洲伊人精品酒店| 中文字幕亚洲在线观看| 视频一区二区三区中文字幕| 亚洲免费黄色| 精品一区在线| 香蕉精品视频在线观看| 久久蜜桃资源一区二区老牛| 国产在线|日韩| 欧美韩日一区| 免费在线小视频| 成人久久一区| 欧美成人日韩| 亚洲国产成人二区| 日韩久久精品网| 欧美亚洲在线日韩| japanese国产精品| 日韩一区二区免费看| 99国产精品私拍| 免费在线观看一区二区三区| 丝袜美腿一区二区三区| 亚洲精品三级| 国产激情久久| 日韩一区二区中文| 久久久人人人| 性一交一乱一区二区洋洋av| 美美哒免费高清在线观看视频一区二区| 美女国产精品| 亚洲精品成a人ⅴ香蕉片| 国产三级精品三级在线观看国产| 你懂的国产精品| 日产精品一区| 免费久久99精品国产自在现线| 日韩欧美精品一区二区综合视频| 国产精品资源| 日本在线精品| 亚洲欧美久久久| 日本午夜精品久久久| 精品国产亚洲一区二区三区在线 | 久久国内精品自在自线400部| 国产精品麻豆成人av电影艾秋| 精品国产一区二区三区噜噜噜| 国产美女高潮在线观看| 亚州av乱码久久精品蜜桃| 色综合视频一区二区三区日韩| 国产激情一区| 91精品国产91久久久久久黑人| 久久av在线| 欧美精品成人| 欧美精品一二| 欧美日韩一区自拍| 日本免费一区二区三区四区| 在线看片日韩| 国产在线观看91一区二区三区| 婷婷综合在线| 国产乱子精品一区二区在线观看| 欧美日韩尤物久久| 日欧美一区二区| 日韩在线免费| 日韩精品免费一区二区夜夜嗨| 国产成人精选| 国产精品普通话对白| 国产精品白丝一区二区三区| 亚洲a一区二区三区| 日韩激情av在线| 国产精品99一区二区三| 一区二区国产在线| 日韩成人精品一区二区| 亚洲精品三级| 久久久噜噜噜| 国产精品v日韩精品v欧美精品网站| 999视频精品| 国产欧美一级| 日韩中文字幕亚洲一区二区va在线| 国产精品二区不卡| 亚洲精品三级| 在线日韩电影| 狠狠久久伊人| 91精品日本| 亚洲深夜福利| 国内自拍视频一区二区三区| 一级成人国产| 欧美亚洲激情| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 麻豆国产在线| 日本不卡在线视频| 一区二区视频欧美| 精品一区91| 日韩国产欧美三级| 性欧美长视频| 精品91久久久久| 欧美不卡高清一区二区三区| 国产欧美日韩一区二区三区四区 | 一级欧洲+日本+国产| 国产精品丝袜在线播放| 亚洲一区二区三区高清不卡| 国产成人免费精品| 欧美日韩xxxx| 免费成人性网站| 国内激情久久| 成人午夜精品| 亚洲天堂免费| 国产精品88久久久久久| 精品久久久网| 国产精品乱战久久久| 日本一区二区三区中文字幕| 伊人久久婷婷| 欧美特黄一级大片| 久久久一本精品| 精品国产成人| 亚洲精选久久| 午夜国产一区二区| 91精品国产91久久久久久黑人| 成人在线免费观看91| 国产极品模特精品一二| 国产毛片精品久久| 午夜亚洲福利| 日本一区二区三区中文字幕| 美美哒免费高清在线观看视频一区二区| 欧美在线亚洲|