SpringBoot运行原理
原理初探:
自动装配:
pom.xml
- spring-boot-dependencies:核心依赖,该依赖在父工程中
- 我们在写或者引入Springboot依赖的时候,不需要指定版本是因为这些都存在于版本仓库中
启动器
-
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency>
-
启动器:就是Springboot的启动场景
-
比如我们导入的web依赖(spring-boot-starter-web),那么他就会自动帮我们导入web需要的所有依赖
-
Springboot会将所有的功能场景都变成一个个的启动器
主程序
//@SpringBootApplication:标注该类是一个Springboot应用,并将启动类下的所有资源导入
@SpringBootApplication
public class SpringbootHelloworldApplication {
public static void main(String[] args) {
//启动Springboot应用
SpringApplication.run(SpringbootHelloworldApplication.class, args);
}
}
-
注解
-
@SpringBootConfiguration:SpringBoot的配置类 ,标注在某个类上 , 表示这是一个SpringBoot的配置类;
@Configuration:spring配置类
@Component:spring的一个组件,负责启动应用
-
@EnableAutoConfiguration:开启自动配置功能
@AutoConfigurationPackage:自动配置包
@Import({AutoConfigurationImportSelector.class}):自动配置中的包注册,给容器导入组件
@Import({AutoConfigurationImportSelector.class}):AutoConfigurationImportSelector自动配置导入选择器
-
@ComponentScan:这个注解在Spring中很重要 ,它对应XML配置中的元素。
作用:自动扫描并加载符合条件的组件或者bean , 将这个bean定义加载到IOC容器中
-
获取所有的配置和候选配置
//获取所有配置 List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes); /** 获取候选配置,getCandidateConfigurations类会去加载一个getSpringFactoriesLoaderFactoryClass类,而该类调用了EnableAutoConfiguration.class,这就是注解@EnableAutoConfiguration的原理 */ protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) { List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), 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; }
-
META-INF/spring.factories:自动配置的核心文件
所以,自动配置真正实现是从classpath中搜寻所有的META-INF/spring.factories配置文件 ,并将其中对应的 org.springframework.boot.autoconfigure. 包下的配置项,通过反射实例化为对应标注了 @Configuration的JavaConfig形式的IOC容器配置类 , 然后将这些都汇总成为一个实例并加载到IOC容器中。
结论:springboot所有的自动配置都是在启动的时候扫描并加载:spring.factories,所有的自动配置类都在这里面,但是配置不一定生效,因此我们要条件判断是否成立,只要导入了对应的start(jar包),就有对应的启动器,那么自动装配就会生效,即配置成功。
springboot运行原理大概步骤:
-
SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值
-
将这些值作为自动配置类导入容器 , 自动配置类就生效 , 帮我们进行自动配置工作;
-
整个J2EE的整体解决方案和自动配置都在springboot-autoconfigure的jar包中;
-
它会给容器中导入非常多的自动配置类 (xxxAutoConfiguration,这些配置类都以AutoConfiguration结尾), 就是给容器中导入这个场景需要的所有组件 , 并配置好这些组件 ;
-
有了自动配置类 , 免去了我们手动编写配置注入功能组件等的工作;
主启动类
默认主启动类:不仅仅是运行了一个main方法,更重要的是它开启了一个服务
//@SpringBootApplication:标注该类是一个Springboot应用
@SpringBootApplication
public class SpringbootHelloworldApplication {
public static void main(String[] args) {
//启动Springboot应用
SpringApplication.run(SpringbootHelloworldApplication.class, args);
}
}
SpringApplication.run分析
SpringApplication
这个类主要做了以下四件事情:
1、推断应用的类型是普通的项目还是Web项目
2、查找并加载所有可用初始化器 , 设置到initializers属性中
3、找出所有的应用程序监听器,设置到listeners属性中
4、推断并设置main方法的定义类,找到运行的主类
好的,我们查看一下他的构造器里面有什么???
public SpringApplication(ResourceLoader resourceLoader, Class... primarySources) {
// ......
this.webApplicationType = WebApplicationType.deduceFromClasspath();
this.setInitializers(this.getSpringFactoriesInstances();
this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));
this.mainApplicationClass = this.deduceMainApplicationClass();
}
重点:
run方法的流程分析
注:本文章内容部分来自blog.kuangstudy.com