@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 {
/**
* 根据类排除不使用的自动配置
*/
@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 = "basePackageClasses")
Class<?>[] scanBasePackageClasses() default {};
}@SpringBootApplication是一个复合注解由
@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan 组成
@ComponentScan
用来指定扫描的组建所在的包路径或class文件。在不指定参数的时候,SpringBoot的@ComponentScan默认会扫描同目录及同目录下级目录的类文件,如果写的类的路径不在其中则需要特别指定
@SpringBootApplication(scanBasePackages = “com.cn.controller")
// 或
@ComponentScan(basePackages = "com.cn.controller")@EnableAutoConfiguration
@EnableAutoConfiguration让SpringBoot可以根据类路径中的jar包依赖可以为项目进行一些自动配置。这也是SpringBoot最核心的功能。当然,前提条件是依赖需要按照starter的规则来构建。 比如,我们添加了web的starter,那么SpringBoot就会自动添加Tomcat和SpringMVC的依赖,然后又会进行一些相应的默认配置。但有些依赖需要我们自己去配置一些内容,比如虽然引入了data-jpa的starter,但是如果我们不配置对应的数据源,程序肯定没办法正常启动。
@SpringBootConfiguration
@SpringBootConfiguration继承自@Configuration,二者功能也一致,标注当前类是配置类, 并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。