遵循约定大于配置的原则,在boot程序启动后,起步依赖中的一些bean对象会自动注入到IOC容器中
程序引入spring-boot-starter-web起步依赖,启动后,会自动往IOC容器中注入DispatcherServlet
(本图片来自互联网,最形象的一张)
注解@SpringBootApplication中组合了 @EnableAutoConfiguration,
@EnableAutoConfiguration又组合了注解@Import(AutoConfigurationImportSelector.class) (该类是importSelector接口的实现类) 该类重写了 String[] selectImports(...)方法,经过层层调用最终得到配置文件
该配置文件中写了一堆自动配置类的全类名,其中有个类(DispatcherServletAutoConfiguration) 完成DispatcherServlet的自动注入
该类源码
当我们引入web起步依赖后 我们就有了DispatcherServletAutoConfiguration这个类
spring boot就能帮我们自动注入一个DispatcherServlet ,并且在方法上为我们声明了@Bean注解 最后将方法的返回值自动注入到IOC容器中
核心在于配置文件
在springboot2.7版本以前,配置文件为spring.factories
在springboot2.7到springboot3.0以前,同时兼容了imports文件和spring.factories文件
springboot3.0以后只支持imports文件
1.在主启动类上添加了@SpringBootApplication注解,这个注解聚合了@EnableAutoConfiguration注解
2.@EnableAutoConfiguration注解又组合了@Import注解,导入了AutoConfigurationImportSelector类
3.AutoConfiguationImportSelector类实现selectImports方法,这个方法经过层层调用,最终会读取META-INF目录下的后缀名为imports文件(boot3.0版本),在boot2.7以前的版本读取的是spring.factories文件,2.7至3.0期间兼容了imports文件和spring.factorues文件,3.0以后只读取imports配置文件,配置文件中配置了很多自动配置类的全限定名
4.springboot读取到这些全限定名以后,会解析注册条件,也就是@Conditional及其衍生注解,把满足条件的Bean对象自动注入IOC容器中