@SpringBootApplication启动类详解
SpringBoot所具备的特征有:
- 内嵌Tomcat或Jetty等Servlet容器;(这个最赞!)
- 可以创建独立的Spring应用程序,并且基于其Maven或Gradle插件,可以创建可执行的JARs和WARs;
- 提供自动配置的“starter”项目对象模型(POMS)以简化Maven配置;
- 尽可能自动配置Spring容器;
- 提供准备好的特性,如指标、健康检查和外部化配置;
接下来我们来看一下SpringBoot主程序
@SpringBootApplication
public class SpringbootDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootDemoApplication.class, args);
}
}
自动配置(@SpringBootApplication)
点开@SpringBootApplication,可以发现它是一个组合注解,主要是由这么几个注解构成的。
注解名称 | 作用 |
---|---|
@SpringBootConfiguration | 标明该类为配置类 |
@EnableAutoConfiguration | 启动自动配置功能 |
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) | 包扫描器 |
我们首先要研究的就是核心的两个注解 @SpringBootConfiguration和**@EnableAutoConfiguration**,逐个进行分析。
@SpringBootConfiguration
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration //配置IOC容器
public @interface SpringBootConfiguration {
}
从上述源码可以看出,SpringBootConfiguration
其实就携带了一个**@Configuration注解**,这个注解我们再熟悉不过了,他就代表自己是一个Spring的配置类。所以我们可以认为:@SpringBootConfiguration = @Configuration 只是被重新封装命名而已
@EnableAutoConfiguration
@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**来收集所有符合自动配置条件的bean定义,并加载到IoC容器。
(1)@AutoConfigurationPackage注解
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
Registrar() {
}
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
AutoConfigurationPackages.register(registry, (String[])(new AutoConfigurationPackages.PackageImports(metadata)).getPackageNames().toArray(new String[0]));
}
}
(2)@Import({AutoConfigurationImportSelector.class})
它帮我们导入了AutoConfigurationImportSelector,这个类中存在一个方法可以帮我们获取所有的配置。