0
点赞
收藏
分享

微信扫一扫

Spring-core-SpringFactoriesLoader类


本类是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会在需要这些实现类的地方,根据全限定名通过反射的方式创建这些类


举报

相关推荐

0 条评论