一、@SpringBootApplication的作用
用于激活 @EnableAutoConfiguration 、@ComponentScan 、@Configuration
相关代码
@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 {
...
}
二、@EnableAutoConfiguration
所有符合自动配置条件的bean定义加载到IoC容器
1. 相关代码
// import 导入了AutoConfigurationImportSelector.class
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
}
// 用于加载所有配置
public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware,
ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered {
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;
}
}
2. 小结
@EnableAutoConfiguration 注解中使用 @Import(AutoConfigurationImportSelector.class) ,AutoConfigurationImportSelector.class 中的 getCandidateConfigurations() 方法调用了 SpringFactoriesLoader.loadFactoryNames() ,SpringFactoriesLoader的作用是加载 META-INF/spring.factories 文件下的所有自动配置。
三、@ComponentScan
1. 相关代码
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
}
2. 小结
ComponentScan做的事情就是告诉Spring从哪里找到bean。
默认查找 @SpringBootApplication 类下的所有子集中需要注入到spring的Bean。
也可以进行配置
四、@SpringBootConfiguration
1. 相关代码
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration // 派生了Configuration
public @interface SpringBootConfiguration {
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
}
2. 小结
@Configuration 标注的类,为Spring配置类。