自动装配的过程

  1. 通过各种注解实现了类与类之间的依赖关系,容器在启动的时候Application.run,会调用EnableAutoConfigurationImportSelector.class的selectImports方法(其实是其父类的方法)
  2. selectImports方法最终会调用SpringFactoriesLoader.loadFactoryNames方法来获取一个全面的常用BeanConfiguration列表
  3. loadFactoryNames方法会读取FACTORIES_RESOURCE_LOCATION(也就是spring-boot-autoconfigure.jar 下面的spring.factories),获取到所有的Spring相关的Bean的全限定名ClassName,大概120多个
  4. selectImports方法继续调用filter(configurations, autoConfigurationMetadata);这个时候会根据这些BeanConfiguration里面的条件,来一一筛选,最关键的是
    @ConditionalOnClass,这个条件注解会去classpath下查找,jar包里面是否有这个条件依赖类,所以必须有了相应的jar包,才有这些依赖类,这个时候这些功能配置类才会生效
  5. 功能配置类生效后,会获取到依赖的默认属性值类,里面有一些该功能的默认属性值
  6. 功能配置类里面配置了最终的功能Bean,这个时候会通过@ConditionalOnMissingBean先判断用户是否自定义了,如果用户没有自定义,就创建一个默认的功能类,并且注入到IOC中
  1. public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {
  2. Enumeration<URL> urls = classLoader.getResources(FACTORIES_RESOURCE_LOCATION);
  3. List<String> result = new ArrayList<String>();
  4. while (urls.hasMoreElements()) {
  5. URL url = urls.nextElement();
  6. Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url));
  7. String factoryClassNames = properties.getProperty(factoryClassName);
  8. result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames)));
  9. }
  10. return result;
  11. }

spring.factories 文件:

org.springframework.context.ApplicationContextInitializer=\
org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\
org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer