pom.xml
启动器
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
dependency>
启动器:说白了就是Springboot的启动场景
比如:spring-boot-starter-web,他就会帮我们自动导入web环境的所有依赖
springboot会将所有的功能场景,都变成一个个的启动器,当我们需要使用某些功能时候,只需要找到对应的启动器即可,starter,可参考文档:https://docs.spring.io/spring-boot/docs/2.3.2.RELEASE/reference/html/using-spring-boot.html#using-boot-starter
主程序
//@SpringBootApplication是标志这个类是springboot的应用
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
//将springboot应用启动
SpringApplication.run(DemoApplication.class, args);
}
}
注解:组合注解
@SpringBootApplication中:
@SpringBootConfiguration:springboot的配置
@Configuration:spring的配置类
@Component:说明这也是个spring组件
@EnableAutoConfiguration:自动配置
@AutoConfigurationPackage:自动配置包
@Import({Registrar.class}):自动配置‘包注册’
AnnotationMetadata metadata:注册元数据
@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;
}
loadFactoryNames类
String factoryTypeName = factoryType.getName();
return (List)loadSpringFactories(classLoader).getOrDefault(factoryTypeName, Collections.emptyList());
loadSpringFactories类
Enumeration<URL> urls = classLoader != null ? classLoader.getResources("META-INF/spring.factories") : ClassLoader.getSystemResources("META-INF/spring.factories");
LinkedMultiValueMap result = new LinkedMultiValueMap();
所以springboot所有的自动配置都是在启动的时候扫描并加载,spring.factories所有配置类都在这里,springboot对其进行读取再遍历加载其资源
②@ConditonalOnXXX:如果这里面的条件都满足,才会生效,所以要导入相应的starter才能有作用!
③@ComponentScan
这个注解在Spring中很重要 ,它对应XML配置中的元素。
作用:自动扫描并加载符合条件的组件或者bean , 将这个bean定义加载到IOC容器中
④org.springframework.boot.autoconfigure. 包下的配置项,通过反射实例化为对应标注了 @Configuration的JavaConfig形式的IOC容器配置类 , 然后将这些都汇总成为一个实例并加载到IOC容器中。
结论:
分析该方法主要分两部分,一部分是SpringApplication的实例化,二是run方法的执行;
SpringApplication
这个类主要做了以下四件事情:
1、推断应用的类型是普通的项目还是Web项目
2、查找并加载所有可用初始化器 , 设置到initializers属性中
3、找出所有的应用程序监听器,设置到listeners属性中
4、推断并设置main方法的定义类,找到运行的主类
学习于狂神说B站视频1 ↩︎