SpringBoot自动配置原理

springboot项目在启动时扫描主配置类,以及主配置类上面的注解@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}
)}
)
public @interface SpringBootApplication {
@AliasFor(
annotation = EnableAutoConfiguration.class
)
Class<?>[] exclude() default {};

@AliasFor(
annotation = EnableAutoConfiguration.class
)
String[] excludeName() default {};

@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackages"
)
String[] scanBasePackages() default {};

@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackageClasses"
)
Class<?>[] scanBasePackageClasses() default {};
}
@ComponentScan:扫描的包的信息。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {

}
@SpringBootConfiguration:表示标注这个注解的类是一个配置类。
@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 {};
}
@EnableAutoConfiguration:实现自动配置。

@Import({AutoConfigurationImportSelector.class}):其中的AutoConfigurationImportSelector的继承关系如下。

已知spring容器会加载ImportSelector接口中实现了String[] selectImports(AnnotationMetadata importingClassMetadata)方法的类。
可以在
AutoConfigurationImportSelector中查看selectImports方法。
@Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        if (!isEnabled(annotationMetadata)) {
            return NO_IMPORTS;
        }
     // 加载/META-INF/spring-autoconfigure-metadata.properties文件中的所有对应属性,以Properties保存,最终以AutoConfigurationMetadata返回。 AutoConfigurationMetadata autoConfigurationMetadata
= AutoConfigurationMetadataLoader .loadMetadata(this.beanClassLoader); AnnotationAttributes attributes = getAttributes(annotationMetadata); List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes); configurations = removeDuplicates(configurations); Set<String> exclusions = getExclusions(annotationMetadata, attributes); checkExcludedClasses(configurations, exclusions); configurations.removeAll(exclusions); configurations = filter(configurations, autoConfigurationMetadata); fireAutoConfigurationImportEvents(configurations, exclusions); return StringUtils.toStringArray(configurations); }

  在此方法中加载/META-INF/spring-autoconfigure-metadata.properties文件中的所有对应属性,并最终返回有用的数组,最后加载到spring容器中。

    这些都是些配置类,在满足条件的情况下,即@ConditionalOnClass满足的情况下,在往容器中添加@Bean标注的组件。

  

 
 

 
posted @ 2020-03-09 12:14  Sherlock-100206  阅读(94)  评论(0)    收藏  举报