springboot @SpringBootApplication注解 作者:马育民 • 2021-10-20 08:08 • 阅读:10058 # @SpringBootApplication 该注解修饰类,说明该类是 springboot **主启动类**,启动时必须启动该类,这与javaee工程不同 该注解类如下: ``` @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 {}; @AliasFor( annotation = ComponentScan.class, attribute = "nameGenerator" ) Class extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class; @AliasFor( annotation = Configuration.class ) boolean proxyBeanMethods() default true; } ``` # 属性: scanBasePackages 当主启动类 与 要扫描的包,不在同一个目录是,通过该属性扫描 [springboot 主启动类与要扫描的包不在同一个路径(@SpringBootApplication)](https://www.malaoshi.top/show_1IX24fawxR0m.html "springboot 主启动类与要扫描的包不在同一个路径(@SpringBootApplication)") # @SpringBootConfiguration 修饰类,说明该类是 **springboot配置类**。 底层依赖`@Configuration`注解 ### @Configuration 是 spring框架 注解,表示 spring配置类,底层依赖`@Component`注解,是一个组件 # @EnableAutoConfiguration 开启自动配置 注解类如下: ``` ....... @AutoConfigurationPackage //重要 @Import({AutoConfigurationImportSelector.class}) //重要 public @interface EnableAutoConfiguration ``` 这里有2个重要的注解: - @AutoConfigurationPackage - @Import({AutoConfigurationImportSelector.class}) ### @AutoConfigurationPackage 注解类如下: ``` @Import({Registrar.class}) //重要 public @interface AutoConfigurationPackage { } ``` 通过`@Import({Registrar.class})`,将主启动类所在的 包下面的组件、子包下面的组件,都扫描到spring容器 如下图: 主启动类`Main`在`top.malaoshi`包下,所以该包下的组件,以及子包下的组件,都能扫描到spring容器中 [![](https://www.malaoshi.top/upload/pic/springboot/20200708165442.png)](https://www.malaoshi.top/upload/pic/springboot/20200708165442.png) **注意:** 主启动类的位置很重要,位置错误,有可能某些组件不能扫描到spring容器中,不起作用 底层依赖`@Import`注解 ### @Import({AutoConfigurationImportSelector.class}) 导入某些功能的自动配置类(配置类类名为:`xxxAutoConfiguration`),简化操作,不需要手动编写配置 springboot启动时,根据`spring-boot-autoconfigure-2.2.2.RELEASE.jar`的`META-INF/spring.factories`配置文件的`org.springframework.boot.autoconfigure.EnableAutoConfiguration`项进行导入 配置文件截图如下: [![](https://www.malaoshi.top/upload/pic/springboot/20200708170747.png)](https://www.malaoshi.top/upload/pic/springboot/20200708170747.png) 相关`xxxAutoConfiguration`如下: [![](https://www.malaoshi.top/upload/pic/springboot/20200708171502.png)](https://www.malaoshi.top/upload/pic/springboot/20200708171502.png) # @ComponentScan 扫描 与 主启动类 同级的包(含子包)下的类注解,也就是说主启动类的位置很重要,写在其他位置,将无法 使用 Controller、service等 详细解释: https://www.malaoshi.top/show_1IXirr18JVi.html 原文出处:http://malaoshi.top/show_1IX24fdMDFTr.html