运行原理
为了研究,我们正常从父项目的pom.xml开始进行研究。
pom.xml
父依赖 spring-boot-starter-parent主要用来管理项目的资源过滤和插件
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
点父依赖进去查看,发现还有一个父依赖spring-boot-dependencies,这里的这个父依赖才是真正管理springboot应用里面的所有依赖版本的地方,是springboot的版本控制中心。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath>../../spring-boot-dependencies</relativePath>
</parent>
启动器:spring-boot-starter-xxx:springboot的场景启动器
spring-boot-starter-web:导入web依赖的组件
<dependency> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
主程序
@SpringBootApplication
作用:标注这是一个springboot主程序类,说明这是一个springboot应用,springboot就是运行这个类的mian方法启动的springboot应用。
@SpringBootApplication //标注这是一个主程序类,说明这是一个springboot应用
public class Springboot01HelloworldApplication {
public static void main(String[] args) {
//这里启动了一个服务,而不是执行了一个方法。
SpringApplication.run(Springboot01HelloworldApplication.class, args);
}
}
点@SpringBootApplication继续研究,会发现有@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan这三个注解
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
1.@ComponentScan: spring自动扫描包
这个我们在spring配置文件中见到过,它用来自动扫描并加载符合条件的组件或者bean,并将bean加载到IOC容器中。
2.@SpringBootConfiguration: springboot的配置类
标注在某个类上,说明这个类是springboot的配置类,在这里它就说明SpringBootApplication这个类是springboot的配置类。
我们继续点@SpringBootConfiguration进去查看,会发现 @Configuration这个注解
2.1 @Configuration:配置类,用来配置spring的xml文件
我们继续点@Configuration进去查看,会发现 @Component这个注解。
2.2 @Component:组件,说明启动类本身也是一个组件,负责启动应用。
至此,@SpringBootConfiguration这条线,我们研究完了。
3.@EnableAutoConfiguration:开启自动装配,通过@EnableAutoConfiguration来帮我们自动配置之前我们需要配置的东西。
我们继续点@EnableAutoConfiguration进去查看,会发现 @AutoConfigurationPackage和@Import({AutoConfigurationImportSelector.class}) 这两个注解。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
3.1 @AutoConfigurationPackage自动装配包
继续点进去查看,出现@Import({Registrar.class})这个注解
3.1.1 @Import({Registrar.class}): spring底层注解,给容器导入一个组件
Registrar.class: 将主启动类所在包及所在包下面的所有子包里面所有的组件都扫描到Spring容器。
至此,@AutoConfigurationPackage这条线我们也研究完了。
3.2 @Import({AutoConfigurationImportSelector.class}): 给容器导入组件
AutoConfigurationImportSelector.class:自动装配导入选择器。
导入的选择器分析:
1.我们点进去AutoConfigurationImportSelector.class这个类的源码进行探究,
2.我们点击getCandidateConfigurations进一步分析
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBcOBO\doy.c9clOBO+y9+*YXP\X[^9khOBOBB[X[..f.&BBO9yn9gk`&hny/+XhnyOBOonmb:/oy`9"yc*9b'yi%fj;:+b,[]X[^\)OBOoa`9"yn9n+9fj;+b,\[\)OBO9ynm+XZ[y9k.byob,:/c9..OBB."l,y+[:!:(cyc'z+:+yk{&al[:!:(cyc:-a9z+l/c.amkl O |