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;
}
- Class<?>[] exclude() default {}:根据class来排除,排除特定的类加入spring容器,传入参数value类型是class类型。
- String[] excludeName() default {}:根据class name来排除,排除特定的类加入spring容器,传入参数value类型是class的全类名字符串数组。
- String[] scanBasePackages() default {}:指定扫描包,参数是包名的字符串数组。
- Class<?>[] scanBasePackageClasses() default {}:扫描特定的包,参数类似是Class类型数组。
- Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class:对应的bean名称的生成器 默认的是BeanNameGenerator
- boolean proxyBeanMethods() default true:属性默认值是true,也就是说该配置类会被代理