本类是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.xx
public class Name{
}
然后执行代码
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会在需要这些实现类的地方,根据全限定名通过反射的方式创建这些类