Springboot框架,Spring-core-SpringFactoriesLoader類

 2023-10-15 阅读 31 评论 0

摘要:本類是spring自動裝配最為核心的類 1.loadFactoryNames方法 public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) {String factoryTypeName = factoryType.getName();return loadSpringFactories(cla

本類是spring自動裝配最為核心的類

1.loadFactoryNames方法

public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) {String factoryTypeName = factoryType.getName();return loadSpringFactories(classLoader).getOrDefault(factoryTypeName, Collections.emptyList());
}

該方法看似復雜其實目的很簡單,就是從jar包下META-INF文件夾(maven項目可直接在src/main/resource文件夾下新建META-INF)下的spring.factories文件(可以理解成properties文件)中,讀取key值,拿到value,因為多個value值的時候spring會用逗號分開,所以該類自動分割逗號,將多個值放到一個list里并且返回,下面舉例
比如spring.factories文件中的內容是這樣子的

// 注意,等號左右都必須是全限定名,而不是simple類名
com.xx.Name=com.xx.ys1,com.xx.ys2,com.xx.ys3

那么我們必須有一個類,這個類必須叫Name.java

package com.xxpublic class Name{
}

Springboot框架、然后執行代碼

ClassLoader cl =  Thread.currentThread().getContextClassLoader();
List<String> names=SpringFactoriesLoader.loadFactoryNames(Name.class, cl);

此時names的size=3,里面的值分別是
“com.xx.ys1”,
“com.xx.ys2”,
“com.xx.ys3”
因為這些值都是全限定名,所以spring就會根據這些值在后續的代碼中實例化這些類

NOTE:實際spring在使用當中,name通常都是一個接口的全限定名,而value則是該接口的部分實現類的全限定名,這些實現類,就是spring的基礎設施類,spring會在需要這些實現類的地方,根據全限定名通過反射的方式創建這些類

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/137053.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息