@SpringBootApplication这个注解由好多注解组成
主要的有以下三个:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
先来看第一个:@SpringBootConfiguration
进入这个注解之后会发现
原来你就是一个@Configuration啊,一个JavaConfig配置类
那我们使用JavaConfig不就是用来配置bean吗,所以有了这个注解之后我们可以在SpringBoot运行的主类中使用@Bean标签配置类了
第二个:@ComponentScan
组件扫描
这个扫描的范围是:SpringBoot主启动类的同级路径及子路径
第三个: @EnableAutoConfiguration
来看这个注解,也是最核心的内容
进入@EnableAutoConfiguration:
这里的作用便是导入了 AutoConfigurationImportSelector 这个类的bean定义
我们都知道,如果这个类实现了ImportSelector接口,那他肯定重写了一个方法,就是我们上面重写过的selectImports方法:
果然,在这个类里面确实有这个selectImports方法:
这个类我们当时返回的是什么?是一个字符串数组String[ ],那这个类无论多么长,返回的肯定就是一个字符串数组,不信你自己看:
这个字符串数组存放的内容我们是否清楚呢?当然清楚了!我们返回的是要加载的Config配置文件的全包名,通过返回这个全包名,我们就能自动装配上这些配置文件下定义的bean对象,从而达到了自动装配的目的!
根据刚才我们自己实现的selectImports方法,我们是通过注解类的名字来查找,并且最终得到需要加载的Config类的全类名,最后返回的。
因此,这里必然有一个根据注解类名字来查找相应的Config文件的操作
我们发现autoConfigurationEntry中保存着我们需要的配置信息,它是通过getAutoConfigurationEntry方法获取的,于是我们继续深入,进入getAutoConfigurationEntry方法
如果你还记得的话,我们自己写的工具类里面也是一个静态方法readPropertyForMe来帮我读取配置文件
但是我们的配置文件路径一定是需要指定的,不能乱放。
从loadFactoryNames方法体来看,好像没有给他传递一个具体路径
那我们大概就知道了,他确实是通过找到路径,然后根据路径读取了配置文件,然后返回了读取的result
这就是loadFactoryNames方法的内部实现。
原来如此。
这里的EnableAutoConfiguration注解,正是我们此行的起点啊…
-----到这里,自动装配到底是什么,应该比较清楚了,原来他是帮我们加载了各种已经写好的Config类文件,实现了这些JavaConfig配置文件的重复利用和组件化--------
总结:
Spring Boot自动装配详细流程图: