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

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

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

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

一、SpringFactoriesLoader 介紹

1.1 SpringFactoriesLoader 簡介

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

Properties 類型格式:

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

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

1.2 SpringFactoriesLoader 常用方法

loadFactoryNames

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

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

1.3 loadFactories 流程圖

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

二、SpringFactoriesLoader 源碼解析

2.1 loadFactoryNames 解析

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

// 默認(rèn)的工廠配置路徑地址,可以存放在多個(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 對象然后處理其中的每個(gè)屬性 URL url = urls.nextElement(); UrlResource resource = new UrlResource(url); Properties properties = PropertiesLoaderUtils.loadProperties(resource); for (Map.Entry<?, ?> entry : properties.entrySet()) {// 獲取工廠類名稱(接口或者抽象類的全限定名)String factoryTypeName = ((String) entry.getKey()).trim();// 將逗號分割的屬性值逐個(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'); // 如果未指定類加載器,則使用默認(rèn)的 ClassLoader classLoaderToUse = classLoader; if (classLoaderToUse == null) { classLoaderToUse = SpringFactoriesLoader.class.getClassLoader(); } // 獲取指定工廠名稱列表 List<String> factoryImplementationNames = loadFactoryNames(factoryType, classLoaderToUse); // 如果記錄器Trace跟蹤激活的話,將工廠名稱列表輸出 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í)例化工廠類,并添加到結(jié)果集中 result.add(instantiateFactory(factoryImplementationName, factoryType, classLoaderToUse)); } // 對結(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); }}

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

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
成人午夜在线| 麻豆国产一区| 亚洲成人va| 91免费精品| 日韩美女一区二区三区在线观看| 精品久久久中文字幕| 国产精品嫩草影院在线看| 青草久久视频| 久久精品xxxxx| 欧美国产另类| 成人影视亚洲图片在线| 日韩欧美午夜| 999久久久精品国产| 日韩精品免费一区二区在线观看| 日韩三区免费| 亚洲第一区色| 国内激情久久| 丝袜亚洲精品中文字幕一区| 亚洲综合福利| 国产精品一国产精品| 久久精品免视看国产成人| 精品视频一区二区三区在线观看| 国产传媒在线| 亚洲一级二级| 一二三区精品| 国产毛片一区二区三区| 欧美国产美女| 欧美91福利在线观看| 免费欧美在线视频| 日本欧美一区二区在线观看| 国产高清亚洲| 日韩高清中文字幕一区二区| 免费视频亚洲| 亚洲另类视频| 欧美精品成人| 日本精品在线中文字幕| 亚洲视频www| 欧美日韩精品一区二区三区在线观看| 欧美国产日本| 亚洲二区精品| 日韩综合小视频| 久久中文字幕一区二区三区| 久久久人人人| 日本亚洲欧洲无免费码在线| 精品丝袜久久| 女同性一区二区三区人了人一| 99国产精品视频免费观看一公开| 中文字幕av一区二区三区四区| 精品中国亚洲| 99在线|亚洲一区二区| 青青草国产成人99久久| 日韩电影免费在线观看| 综合激情一区| 美女福利一区二区三区| 中文字幕一区二区三区四区久久| 久久亚洲精精品中文字幕| 欧美精品一区二区三区精品| 欧美亚洲tv| 精品一区三区| 你懂的国产精品永久在线| 欧美日韩一区二区三区视频播放| 亚洲一区二区日韩| 国产精品99一区二区三| 一级成人国产| 欧美精品高清| 欧美日韩在线精品一区二区三区激情综合 | 国产欧美一区二区精品久久久| 中文在线а√天堂| 在线精品一区二区| 福利一区二区三区视频在线观看| 国产亚洲精品v| 久久一区国产| 亚洲人成精品久久久| 高清一区二区三区av| 亚洲精品美女91| 色综合www| 国产精品调教视频| 亚洲欧美日韩在线观看a三区| 成人在线视频免费| 欧美午夜网站| 亚洲一区国产| 日韩欧美二区| 老色鬼精品视频在线观看播放| 日韩在线卡一卡二| 欧美日韩国产观看视频| 日本中文字幕视频一区| 欧美99久久| 日韩一区二区三区免费播放| 国产乱码精品一区二区亚洲| 性色av一区二区怡红| 午夜精品久久久久久久久久蜜桃| 欧美黄色精品| 91成人小视频| 亚洲欧美久久| 日韩亚洲一区在线| 成人午夜亚洲| 国产精品白丝久久av网站| 蜜桃视频一区二区三区在线观看 | 91成人小视频| 亚洲区国产区| 免费中文字幕日韩欧美| 欧美亚洲在线日韩| 日韩免费看片| 麻豆视频在线观看免费网站黄| 久久精品xxxxx| 五月亚洲婷婷 | 久久国产欧美| 韩国久久久久久| 狂野欧美性猛交xxxx| 日本久久二区| 四虎精品一区二区免费| 三级欧美韩日大片在线看| 亚洲精品一区二区在线看| 久久久国产亚洲精品| 色黄视频在线观看| 成人高清一区| 国产成人精品亚洲线观看| 麻豆国产一区| 精品欧美日韩精品| 久久精品伊人| 国内不卡的一区二区三区中文字幕| 国产精品igao视频网网址不卡日韩 | 久久精品国产99国产精品| 国产亚洲一卡2卡3卡4卡新区| 日本中文字幕一区二区视频| 综合亚洲视频| 深夜日韩欧美| 日韩精品欧美大片| 日本午夜精品一区二区三区电影 | 麻豆理论在线观看| 国产91在线精品| 91一区二区| 肉色欧美久久久久久久免费看 | 欧美国产中文高清| 精品欧美日韩精品| а√天堂8资源中文在线| 亚洲天堂免费电影| 国产91精品对白在线播放| 久久精品国产68国产精品亚洲| 999国产精品视频| 亚洲大全视频| 石原莉奈在线亚洲二区| 视频一区二区国产| 日韩高清不卡在线| 久久av超碰| 天堂а√在线最新版中文在线| 99久久九九| 久久xxxx| 久久国产免费看| 国产一区调教| 国精品一区二区| 亚洲三区欧美一区国产二区| 欧美日韩午夜电影网| 久久精品一区二区三区中文字幕| 在线人成日本视频| av一区二区高清| 亚洲bt欧美bt精品777| 国产日产一区| 天堂8中文在线最新版在线| 国产精品免费看| 91精品丝袜国产高跟在线| 精品99在线| 99国产精品久久久久久久| 日韩国产成人精品| 国产999精品在线观看| 午夜日韩福利| 91精品麻豆| 久久蜜桃资源一区二区老牛| 国产精品老牛| 欧美韩一区二区| 五月天久久777| 91福利精品在线观看| 国产一区二区精品久| 亚洲精品888| 国产欧美一区二区精品久久久 | 欧美日韩黑人| 国产精品欧美在线观看| 欧美日韩在线网站| 日韩中文字幕视频网| 岛国精品一区| 亚洲一区日韩| 精品一区视频| 视频一区免费在线观看| 久久精品九色| 免费视频久久| 国产精品1区| 免费久久99精品国产自在现线| 国产精品115| 免费久久99精品国产自在现线| 麻豆精品久久| 免费人成精品欧美精品| 精品理论电影在线| 视频在线观看一区| 天堂中文av在线资源库| 日韩激情一二三区| 国产99精品| 精品久久久亚洲| 一区二区国产在线| 久久一级电影| 日韩.com|