@SpringBootApplication //主程序类 @ComponentScan(basePackages = {"com.example.demo"}) public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
@SpringBootApplication:标注该类为spring boot主程序类
@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 {
@SpringBootConfiguration:表示boot的配置类(spring boot的)
@Configuration:同样也是标注为配置类(spring的)
@EnableAutoConfiguration:开启自动配置功能:
以前我们需要配置的东西,现在spring boot帮我们自动配置:@EnableAutoConfiguration告诉spring boot开启自动配置功能;这样才能生效
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import(AutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration {
@AutoConfigurationPackage:自动配置包
@Import(AutoConfigurationPackages.Registrar.class)
spring的底层注解@Import,给容器导入一个组件()
AutoConfigurationPackages.Registrar.class:是将@SpringBootConfiguration 标注的类所在的包下的子包里面所有的组建扫描到spring容器中。
@Import(AutoConfigurationImportSelector.class):导入组件;
将所有需要导入的组件以全类名的方式返回:这些组件就会被添加到容器中
@Override public String[] selectImports(AnnotationMetadata annotationMetadata) { if (!isEnabled(annotationMetadata)) { return NO_IMPORTS; } 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); }
configurations:里面存储的数组信息就是需要spring自动配置的全类名。(XXX.AutoConfiguration)。
有了自动配置类,免去了我们自己编写配置注入的工作,非常的简便
getCandidateConfigurations:主要是调用了SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());这个方法。其中第一个参数为 EnableAutoConfiguration.class,第二个参数为beanClassLoader。其作用为从我们类路径下的META-INF/spring.factories文件中获取EnableAutoConfiguration指定的 值。