- public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware,
- ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered
public interface DeferredImportSelector extends ImportSelector
中其
AutoConfigurationImportSelector的核心- @override
- public String[] selectImports(AnnotationMetadata annotationMetadata){
- if(!isEmabled(annotationMetadata)){
- return NO_IMPORTS;
-
- }
- AutoconfigurationMetadata autoConfigurationMetadata=AutoconfigurationMetadataLoder.loadMetadata(this.beanClassLoader);
- // 加载自动配置类
- AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(autoConfigurationMetadata,
- annotationMetadata);
-
- return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
- }
- protected AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationMetadata autoConfigurationMetadata, AnnotationMetadata annotationMetadata){
- if(!isEnabled(annotationMetadata)){
- return EMPTY_ENTRY;
- }
- AnnotationAttributes attributes=getAttributes(annotationMetadata);
- //核心-加载候选的自动配置类
- List
configurations=getCandidateConfigurations(annotationMetadata, attribute); - configurations=removeDuplicates(configurations);
- Set
exclusions=getExclusions(annotationMetadata, attributes); - checkExcludedClasses(configurations, exclusions);
- configurations.removeAll(exclusions);
- configurations = filter(configurations, autoConfigurationMetadata);
- fireAutoConfigurationImportEvents(configurations, exclusions);
- return new AutoConfigurationEntry(configurations, exclusions);
- }
- public static List
loadFactoryNames(Class> factoryClass,@Nullable ClassLoader classLoader){ - String factoryClassName = factoryClass.getName();
- return laodSpringFactories(classLoader).getOrDefault(factoryClassName,Collections.emptyList());
-
- }
-
- public static final String FACTORIES_RESOURCE_LOCATION="META-INF/spring.factories";
-
- private static final Map
> cache=new ConcurrentReferenceHashMap<>(); -
- private static Map
> loadSpringFactories(@Nullable ClassLoader classLoader){ -
- Map
> result=cache.get(classLoader); - if(result!=null){
- return result;
- }
- try{
- //获取当前 classpath 下所有jar包中有的 spring.factories 文件,并将它们加载到内存中
- Enumeration
urls=(classLoader != null ? - classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :
- ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
- //每一个文件,并用 Properties 方式加载文件,之后把这个文件中每一组键值对都加载出来,放入 MultiValueMap 中
- result = new LinkedMultiValueMap<>();
- while (urls.hasMoreElements()) {
- URL url = urls.nextElement();
- UrlResource resource = new UrlResource(url);
- Properties properties = PropertiesLoaderUtils.loadProperties(resource);
- for (Map.Entry, ?> entry : properties.entrySet()) {
- String factoryClassName = ((String) entry.getKey()).trim();
- for (String factoryName : StringUtils.commaDelimitedListToStringArray((String) entry.getValue())) {
- result.add(factoryClassName, factoryName.trim());
- }
- }
- }
- cache.put(classLoader, result);
- return result;
-
- }catch (IOException ex){
- throw new IllegalArgumentException("Unable to load factories from location [" +
- FACTORIES_RESOURCE_LOCATION +"]",ex );
- }
-
- }