spring学习笔记2|从源码看springboot如何实现自动配置
搭建一个ssm框架需要开发者手动进行大量配置,springboot的核心就是【自动配置】,使开发者专注于业务层。
springboot接管了:
DispatcherServlet配置
view层配置
自动导入依赖
【pom.xml】里有:
启动器:使自动配置生效
spring-boot-starter开头的
spring-boot-starter-web:web环境所有依赖。如实现http接口(已包含spirngmvc),容器默认为tomcat
spring-boot-starter-test:单元测试
build:支持打包成接口在target中
【启动类】里有:
@SpringbootApplication:导入启动类下的所有资源
@ComponentScan:扫描主启动类同级的包,【所以建包一定要与该类同级】
@SpringBootConfiguration:支持springboot的配置
@Configuration:标记为配置类
@Component:标记为组件
@EnableAutoConfiguration:支持自动配置。
@AutoConfigurationPackage:自动配置包
AutoConfigurationPackages.Registrar.class,自动将导入的包注册
@Import({AutoConfigurationImportSelector.class}):导入自动配置选择器,选择 启动类要用的配置导入,AutoConfigurationImportSelector.class里有:
List<String> configurations =
this.getCandidateConfigurations(annotationMetadata, attributes),获取了所有配置。
getCandidateConfigurations方法里有一个load方法,加载了META-INF/spring/%s.imports”里的自动配置类,注意,这是一大堆是所有的自动配置类,包括此工程用不上的
它们的@ConditionalOnxxx注解能识别哪些是需要的,以类名形式返回,添加到容器,这些类标记为bean。
getCandidateConfigurations方法下面还有一个空判断:
"No auto configuration classes found in META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. If you are using a custom packaging, make sure that file is correct.”告诉开发者你要的配置类真找不到了,换个版本吧
找到META-INF/spring.factories,第四项# Auto Configuration Import Filters就是springboot帮我们导入的、用得上的自动配置类。只要我们pom.xml导入了对应启动器,就会配置成功。
综上,springboot在启动时扫描AutoConfiguration.imports. 根据@ConditionalOnxxx注解能识别哪些是需要的,加载到spring.factories,完成了自动配置。
ps:我的springboot版本是3.0.5,老一点的版本貌似将所有配置类也放在spring.factories中,但仍通过@ConditionalOnxxx判断。不太会看源码,欢迎大佬指正。