SpringBoot自动装配原理和SpringBoot的启动
一.SpringBoot比起Spring的优势在哪里?
Spring Boot 是 Spring 框架的扩展,其核心目标是通过约定优于配置和自动化机制显著提升开发效率。
Spring Boot 比起Spring没有那么多复杂的配置文件,只需要添加对应的依赖和注解就行.
SpringBoot自动装配原理
在SpringBoot的启动类上有一个启动类注解@SpringBootApplication,这是一个复合注解,里面封装了两个注解:@SpringBootConfiguration和@EnableAutoConfiguration.
@SpringBootConfiguration:这个注解里面封装了一个@Configuration注解,表示该启动类是一个配置类,可以在启动类
定义一些Bean.
@EnableAutoConfiguration:这也是一个复合注解,里面封装了两个注解@AutoConfigurationPackage和@Import注解,其中@Import注解里放了一个AutoConfigurationImportSelector.class类,这个类有一个方法selectImports(),该方法能够返回一个字符串数组,这个数组里放了一些Bean的全类名.
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)) {
return NO_IMPORTS;
}
AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);
return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
而字符串数组里的内容是通过getAutoConfigurationEntry()获得的,getAutoConfigurationEntry方法里调用了getCandidateConfigurations方法获得,在getCandidateConfigurations方法中SpringFactoriesLoader会从配置文件META-INF/spring.factories中读取到一些类的全类名,最终会经过getAutoConfigurationEntry()方法进行一系列筛选,最后留下的一些Bean的全类名会放入到字符串数组中.
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = new ArrayList<>(
//SpringFactoriesLoader方法会从META-INF/spring.factories文件中读取一些Bean的全类名
SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader()));
ImportCandidates.load(AutoConfiguration.class, getBeanClassLoader()).forEach(configurations::add);
Assert.notEmpty(configurations,
"No auto configuration classes found in META-INF/spring.factories nor in META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. If you "
+ "are using a custom packaging, make sure that file is correct.");
return configurations;
}
而在Spring启动时,会执行run方法,run方法首先会从 META-INF/spring.factories 加载 ApplicationContextInitializer 和 ApplicationListener创建**SpringApplication** 实例,然后解析 application.properties确认当前运行环境,然后根据Spirng的应用类型不同确认上下文类型例如Servlet应用的上下文AnnotationConfigServletWebServerApplicationContext.
接下来Spring会进行上下文的初始化,通过 @ComponentScan 扫描主类所在包及其子包的组件,初始化之后会刷新上下文**refreshContext,在这一步中,Spring会完成BeanFactory的创建并注册标准Bean,并进行Auto-configuration**自动配置,这里Spring会通过条件注解(如 @ConditionalOnClass)筛选有效配置,最后按照顺序创建Bean.