1.POM
父依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
点进去还有一个父依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.4.3</version>
</parent>
spring-boot-dependencies才是真正管理所有Springboot要用到的依赖版本,以后我们就不用手动导入依赖版本。
spring-boot-starter
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
spring-boot-starter是核心启动器,支持自动装配,日志和yaml
starter-xxx是springboot的场景启动器,springboot把所用功能场景都抽取出来做成一个个启动器,当我们需要用哪个场景时,只需要导入相对于的starter-xxx即可。未来我们也可以自定义starter。
主启动类
//@SpringBootApplication 来标注一个主程序类
//说明这是一个Spring Boot应用
@SpringBootApplication
public class SpringbootApplication {
public static void main(String[] args) {
//以为是启动了一个方法,没想到启动了一个服务
SpringApplication.run(SpringbootApplication.class, args);
}
}
@SpringBootConfiguration //springboot 的配置
@Configuration //spring的配置类
@Component //spring组件
@EnableAutoConfiguration //自动配置
@AutoConfigurationPackage //自动配置,包注册
@AutoConfigurationPackage //导入选择器
@Import({AutoConfigurationImportSelector.class}) //自动配置导入选择
#获取所有配置
List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
#获取候选配置
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
return configurations;
}
自动配置的核心文件
Properties properties = PropertiesLoaderUtils.loadProperties(resource);
//所有资源加载到配置类中
总结
spring boot的所有自动配置都是在扫描的时候自动加载,在spring.factories里,但是不一定生效,要判断条件是否成立。