Springboot的启动类非常简单,其中最关键的两部分是Annotation定义(@SpringBootApplication)和类定义(SpringApplication.run)。本文中主要对@SpringBootApplication进行相关解析。
@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) })
- public @interface SpringBootApplication {
- ......
- }
从源码来看@SpringBootApplication是一个复合注解,包括@ComponentScan,和@SpringBootConfiguration,@EnableAutoConfiguration。
@SpringBootConfiguration继承自@Configuration,二者功能也一致,标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到srping容器中,并且实例名就是方法名。
@ComponentScan,扫描当前包及其子包下被@Component,@Controller,@Service,@Repository注解标记的类并纳入到spring容器中进行管理。
@EnableAutoConfiguration 的作用是开启自动配置。@EnableAutoConfiguration注解的意思就是Springboot根据你添加的jar包来配置你项目的默认配置,比如根据spring-boot-starter-web ,来判断你的项目是否需要添加了webmvc和tomcat,就会自动的帮你配置web项目中所需要的默认配置
- public @interface SpringBootApplication {
- @AliasFor(annotation = EnableAutoConfiguration.class)
- Class<?>[] exclude() default {};
-
- @AliasFor(annotation = EnableAutoConfiguration.class)
- String[] excludeName() default {};
-
- @AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
- String[] scanBasePackages() default {};
-
- @AliasFor(annotation = ComponentScan.class, attribute = "nameGenerator")
- Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;
-
- @AliasFor(annotation = Configuration.class)
- boolean proxyBeanMethods() default true;
-
- }