就 Spring Boot 启动的
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}
)}
)
-
@SpringBootApplication
组合了
@SpringBootConfiguration
、@ComponentScan
、@EnableAutoConfiguration
,是 Spring Boot 项目的入口。-
@SpringBootConfiguration
等同于
@Configuration
-
@Configuration
IOC 容器的配置标签,等同于 Spring 中
<bean></bean>
的配置,@Configuration
标注的就是一个 JavaConfig 的配置类,注册 bean 需要在方法上使用@Bean
标注
-
-
@EnableAutoConfiguration
自动配置,通过
@Import
收集和注册特定场景的 bean 定义。-
@EnableAutoConfigurationImportSelector
搜索服务条件的
@Configuration
配置,并加载到 Spring Boot 中,创建并使用 IOC 容器。 SpringFactoriesLoader.java
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; }
SpringFactoriesLoader
会加载META-INF/spring.factories
配置文件,从而加载相应类到 IOC 容器中 -
-
@ComponentScan
自动扫描符合条件的组件,如
@Component
、@Repository
等,也可以通过指定basePackages
来更细粒度的定制扫描范围。
graph TD A[收集条件和回调接口 ApplicationIntializer/ApplicationListener] --step1 started--> B[准备 Environment] B -- step2 environmentPrepared--> C[初始化 ApplicationContext 设置 Enviornment] C -- step3 contextPrepared contextLoaded --> D[refresh context 启动完成]
-