1.@SpringBootApplication底层封装了三个注解:@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan
阅读源码发现:SpringBoot在启动的时候,会自动的加载META-INF/spring.factories和META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports这两个文件中的信息,这两个文件中配置的其实就是类的全类名,这份配置文件最终会被读取出来,并且通过@Import注解加载到IOC容器当中
加载完成之后,会自动封装到configurations这个List<String>的集合当中
然后再将其封装到String类型的数组当中,String类型的数组当中封装的数据最终就是要被加载到SpringBoot IOC容器中的bean或者配置类
总结:@EnableAutoConfiguration是SpringBoot实现自动化配置的核心注解,其底层封装了一个@Import注解,这个注解当中指定了ImportSelector这个接口的实现类——AutoConfigurationImportSelector,AutoConfigurationImportSelector这个实现类实现了ImportSelector这个接口中的方法——selectImports(),这个方法的返回值是一个String类型的数组,在这个数组当中封装的就是我要导入到Spring IOC容器中的类的全类名,在AutoConfigurationImportSelector方法中加载了两个文件:META-INF/spring.factories(早期,3.0版本后被彻底移除了)和META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,现在我们要导入的配置类,都定义在META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports下,这份文件下定义的就是配置类的全类名,在这个文件当中,我们就可以通过@Bean注解来声明一个一个的bean对象,最终,springboot在启动的时候就会加载这个配置文件中所配置的这些类,然后,将所配置的这些类封装到String类型的数组当中,最终通过@Import这个注解全部加载到spring的IOC容器当中,交给IOC容器进行管理
注意:META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports中的类并不是全部会被加载到IOC容器当中,这涉及到下边要讲解的条件装配注解@Conditional