Spring Boot自动配置原理
2019-07-04 20:36
525 查看
加载
SpringBoot应用启动的时候,从主方法进行启动
@SpringBootApplication public class XxxApplication { public static void main(String[] args) { SpringApplication.run(XxxApplication.class, args); } }
@SpringBootApplication是一个组合注解,包含如下注解
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan( excludeFilters = {@Filter( type = FilterType.CUSTOM, classes = {TypeExcludeFilter.class} ), @Filter( type = FilterType.CUSTOM, classes = {AutoConfigurationExcludeFilter.class} )} )
@EnableAutoConfiguration为开启自动配置,其也是组合注解,包含如下注解
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import({AutoConfigurationImportSelector.class})
主要功能由@Import提供,其导入的AutoConfigurationImportSelector的selectImports方法
public String[] selectImports(AnnotationMetadata annotationMetadata) { if (!this.isEnabled(annotationMetadata)) { return NO_IMPORTS; } else { AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader); AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata); return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations()); } }
调用getAutoConfigurationEntry方法
protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationMetadata autoConfigurationMetadata, AnnotationMetadata annotationMetadata) { if (!this.isEnabled(annotationMetadata)) { return EMPTY_ENTRY; } else { AnnotationAttributes attributes = this.getAttributes(annotationMetadata); List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes); configurations = this.removeDuplicates(configurations); Set<String> exclusions = this.getExclusions(annotationMetadata, attributes); this.checkExcludedClasses(configurations, exclusions); configurations.removeAll(exclusions); configurations = this.filter(configurations, autoConfigurationMetadata); this.fireAutoConfigurationImportEvents(configurations, exclusions); return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions); } }
调用getCandidateConfigurations方法
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方法扫描spring.factories文件中包含的JAR文件,加载到Spring容器。
public static AutoConfigurationMetadata loadMetadata(ClassLoader classLoader) { return loadMetadata(classLoader, "META-INF/spring-autoconfigure-metadata.properties"); }
生效
这些自动配置类都是在某些条件下生效
@ConditionalOnBean:当容器里有指定的bean的条件下 @ConditionalOnMissingBean:当容器里不存在指定bean的条件下 @ConditionalOnClass:当类路径下有指定类的条件下 @ConditionalOnMissingClass:当类路径下不存在指定类的条件下 @ConditionalOnProperty:指定的属性是否有指定的值
相关文章推荐
- Spring Boot核心原理-自动配置
- Spring Boot核心原理-自动配置
- Spring Boot自动配置原理(转)
- Spring Boot核心原理-自动配置
- 三、SpringBoot——自动配置原理
- SpringBoot与数据访问JDBC&自动配置原理(一)
- SpringBoot自动配置原理
- SpringBoot学习之自动配置原理
- Spring Boot 运行原理之自动配置
- Spring Boot之自动配置原理以及自定义starter
- Spring Boot自动配置原理
- Spring Boot之自动配置的原理
- Spring boot实战中自动配置原理分析
- springboot自动配置的核心原理
- Spring Boot自动配置原理、实战
- 第5章 Spring Boot自动配置原理
- [Spring Boot] 4. Spring Boot实现自动配置的原理
- Spring Boot核心原理-自动配置 以及@ConfigurationProperties 注解
- SpringBoot学习笔记(3) Spring Boot 运行原理,自动配置
- Spring Boot 运行原理 - 查看Spring Boot自动配置项