1.启动类上有一个注解,是一个复合注解,由三个注解组成
第一个注解是@SpringBootConfiguration,底层是一个@Configuration注解,表示当前类是一个配置类
第二个注解是@ComponentScan是一个组件扫描,spring会扫描引导类所在包及子包下的组件
第三个注解是@EnableAutoConfiguration
注解@EnableAutoConfiguration点进去之后会有一个注解@Import,属性是AutoConfigurationImportSelector.class
AutoConfigurationImportSelector类点进去后有一个selectImports方法,里面有一个getAutoConfigurationEntry方法,返回一个配置类的键值对,然后将这个键值对转换为一个字符串数组进行返回
getAutoConfigurationEntry方法点进去后有一个getCandidateConfigurations方法,会返回一个泛型为String的List集合
getCandidateConfigurations方法中new了一个集合,其中的元素为SpringFactoriesLoader类中的loadFactoryNames方法返回的字符串集合
自动配置类需要在这两个配置文件中
或
loadFactoryNames方法的第一个参数为getSpringFactoriesLoaderFactoryClass方法,这个方法返回的就是EnableAutoConfiguration.class
进入到loadFactoryNames方法,获取传入的EnableAutoConfiguration的全类名,并使用loadSpringFactories方法进行返回
从指定类加载器中获取一个集合,扫描META-INF/spring.factories文件中的资源
注册自动配置包名
一些自动配置类的条件
总结
1:启动类上有一个注解,是一个复合注解,由三个注解组成
第一个注解是@SpringBootConfiguration,底层是一个@Configuration注解,表示当前类是一个配置类
第二个注解是@ComponentScan是一个组件扫描,spring会扫描引导类所在包及子包下的组件
第三个注解是@EnableAutoConfiguration
底层是通过@Import注解导入一个AutoConfigurationImportSelector配置类,这个配置类会自动调用selectImports方法,这个方法会扫描META-INF/spring.factories的文件中key为EnableAutoConfiguration的所有数据,同时还会扫描META-INF/spring/org.springframework.boot.autoconfiguration.AutoConfiguration.imports中的数据,再经过@ConditionalXxx的条件判断,把满足条件的内容加载到内存中,封装成一个字符串数组
2.启动类中的run方法
这个方法会把上面注解实现加载到到内存中的字符串数组,根据条件,反射创建对象,把对象当做bean注入spring容器中