springboot给人的感觉就是简单易用,相比spring,少了xml文件繁琐的配置,想和其他组件结合,只需要引入相关组件jar包,并在yml或者property文件中添加组件需要的值就可以使用。springboot和spring相比就是Spring在xml文件中声明了很多bean,例如datasource,试图解析器等相关bean。springboot通过maven依赖,自动将这些bean引入到ioc容器。springboot自带tomcat,
问题是springboot如何通过maven依赖将这些bean引入到了ioc容器的,并且读取配置文件给bean使用的?
在springboot的启动类中有一个@SpringBootApplication,@SpringBootApplication中有一个@EnableAutoConfiguration,在@EnableAutoConfiguration中有@Import,通过@Import中实现了ImportSelector接口的DeferredImportSelector类将那些需要的bean引入到ioc容器中。至于引入那些bean,通过SpringFactoriesLoader.loadFactoryNames方法读取META-INF/spring.factories文件中信息,spring.factories中包含了很多配置类,这些配置类里面声明了用到的bean,当然不是每个配置类都会被引入的,因为有些配置类的引入是带有条件的,通过@ConditionalOnBean @ConditionalOnClass这些定义需要的条件。然后通过@EnableConfigurationProperties与@ConfigurationProperties让yml或者properties文件里面的值赋值到bean中。
总结起来就是这样的。
1.读取需要引入的bean @SpringBootApplication -->@EnableAutoConfiguration-->@Import-->DeferredImportSelector的selectImports方法--->SpringFactoriesLoader.loadFactoryNamesd读取maven依赖jar包下的spring.factories文件获取到需要加载的bean
2.将bean引入到IOC容器中 通过@import中---->DeferredImportSelector的selectImports方法将读取到的bean加载到ioc容器中
3.让配置文件里面的值生效 通过@EnableConfigurationProperties与@ConfigurationProperties让yml或者properties文件里面的值赋值到bean中。
springboot原理源码分析