说明:在SpringBoot项目中,我们添加了许许多多的注解,这些注解提高了开发效率。这是因为SpringBoot在项目启动时,帮我们自动装配了大量的Bean对象,可以通过分析源码查看自动装配的大致原理。
第一步:@SpringBootApplication
进入到启动类中的@SpringBootApplication注解中,该注解里面有七个注解,上面四个是元注解,无需理会,下面三个注解分别表示:
@SpringBootConfiguration:该注解内包含@Configuration注解,表明该类是一个配置类;
@EnableAutoConfiguration:自动装配注解;
@ComponentScan():组件扫描注解,项目启动时,会扫码启动类平级的类和子包中的类;
可以看出,这三个注解中@EnableAutoConfiguration是核心,进一步分析
第二步:@EnableAutoConfiguration
该注解内,使用@Import()导入了一个自动装配选择器类(AutoConfigurationImportSelector),点开这个类分析
第三步:AutoConfigurationImportSelector.class
进入到这个类中,可以找到一个自动装配配置的具体实现方法(getCandidateConfigurations()),进入该方法内分析
第四步:getCandidateConfigurations()
该方法下面有一段提示,表示该方法的内容来自于这两个文件中的其中一个,并且该方法返回值类型是字符串类型的集合
第五步:在依赖管理中找到对应的文件
找到对应上面方法中提示的对应文件,可以知道该文件内存的是各种Bean对象的全限定类名
(所有Bean对象的全限定类名)
总结
SpringBoot自动配置原理大致如下:@SpringBootApplication注解中的,@EnableAutoConfiguration注解中的@Import注解,会自动装配AutoConfigurationImportSelector类,而该类中会执行一个getCandidateConfigurations()方法,该方法会读取SpringBoot文件中的一个文件(在Spring2.7.5 以前是spring.factories),该文件内存放着大量的Bean对象的全限定类名。在项目启动时,会有选择性的自动装配这些对象到IOC容器中。
之所以说有选择,是因为在源码中,还有一系列的选择注解,只有符合条件的对象才会被自动装配,例如以下三个:
@ConditionalOnClass:判断环境中有对应字节码文件,才注册bean到IOC容器
@ConditionalOnMissingBean:判断环境中没有对应的bean(类型或名称),才注册bean到IOC容器
@ConditionalOnProperty:判断配置文件中有对应属性和值,才注册bean到IOC容器