SpringBoot 的启动过程如下:
1 2 3 4 5 6 7
| @SpringBootApplication public class SpringbootlLearningApplication {
public static void main(String[] args) { SpringApplication.run(SpringbootlLearningApplication.class, args); } }
|
SpringBoot 简化了大量的配置的信息,几行代码就将 Spring Boot 服务启动,具体观察一下,有两部分指的注意:
- @SpringBootApplication 注解去指定启动类
- SpringApplication.run(SpringbootLearingApplication.class, args) 启动 Spring 容器
@SpringBootApplication
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| @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 { ... }
|
可以看到,这里 @SpringBootApplication 是一个组合注解,它包含了以下三个重要的注解:
- @SpringBootConfiguration
- @EnableAutoConfiguration
- @ComponentScan
@SpringBootConfiguration
1 2 3 4 5 6
| @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration public @interface SpringBootConfiguration { }
|
可以看出,@SpringBootConfiguration 实际上就是一个配置注解,与 @Configuration 不同的是,一个应用程序中只能使用一个 @SpringBootConfiguration,而在我们启动 SpringBootApplication 的时候就已经开启配置,而 @Configuration 可以根据需要进行 JavaConfig 的方式进行多个实例配置
@EnableAutoConfiguration
1 2 3 4 5 6 7 8 9 10 11 12 13
| @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这个复合annotation 的主要作用是开启容器的自动配置功能,而具体由 @AutoConfigurationPackage 和 @Import({AutoConfigurationImportSelector.class}) 实现。