应用在Springboot的启动类上:

  1. @SpringBootApplication
  2. public class Application {
  3. public static void main(String[] args) {
  4. SpringApplication.run(Application.class, args);
  5. }
  6. }

SpringBootApplication注解内容:

  1. @Target({ElementType.TYPE})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. @Inherited
  5. @SpringBootConfiguration
  6. @EnableAutoConfiguration
  7. @ComponentScan(
  8. excludeFilters = {@Filter(
  9. type = FilterType.CUSTOM,
  10. classes = {TypeExcludeFilter.class}
  11. ), @Filter(
  12. type = FilterType.CUSTOM,
  13. classes = {AutoConfigurationExcludeFilter.class}
  14. )}
  15. )
  16. public @interface SpringBootApplication {
  17. .....
  18. }

是一个“三体”结构,重要的只有三个Annotation:

  1. @Configuration(在SpringBootConfiguration里面)
    1. 以JavaConfig形式的Spring IOC容器的配置类使用的那个@Configuration,所以这里的启动类标注了@Configuration之后,其本质也就是一个IOC容器的配置类
  2. @EnableAutoConfiguration
    1. 借助@import的帮助,将所有符合自动配置条件的bean定义加载到IOC容器。
    2. 也是一个复合Annotation。
  3. @ComponentScan

    1. 自动扫描并加载复合条件的组件或bean定义,最终将这些bean定义加载到容器中。
    2. 可以通过basePackages等属性指定@ComponentScan自动扫描的范围。
    3. 如果不指定,则默认Spring框架实现从声明@ComponentScan所在类的package开始扫描,默认情况是不指定的 ,所以Springboot的启动类最好放在root package下。

      @EnableAutoConfiguration

      内容:

      1. @Target({ElementType.TYPE})
      2. @Retention(RetentionPolicy.RUNTIME)
      3. @Documented
      4. @Inherited
      5. @AutoConfigurationPackage
      6. @Import({AutoConfigurationImportSelector.class})
      7. public @interface EnableAutoConfiguration {
      8. String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
      9. Class<?>[] exclude() default {};
      10. String[] excludeName() default {};
      11. }

      最关键的是:@Import(AutoConfigurationImportSelector.class)。
      借助AutoConfigurationImportSelector类@EnableAutoConfiguration可以帮助Springboot应用将所有符合条件的@configuration都加载到当前Springboot创建并使用的IOC容器。

      @SpringBootApplication包含的方法

      1. Class<?>[] exclude() default{};
      2. //根据Class来排除特定的类加入spring容器,传入参数是class类型
      3. String[] excludeName() default{};
      4. //根据Class name排除特定的类加入spring容器,传入参数是class的全类名字符串数组
      5. String[] scanBasePackages() default{};
      6. //指定扫描包,参数是包名的字符串数组
      7. Class<?>[] scanBasePackageClasses() default{};
      8. //指定扫描包,参数是Class类型数组

      @SpringBootApplication三个重要注解

  • @Configuration
    • 定义Spring IOC容器的配置类
  • @EnableAutoConfiguration
    • 从classpath中搜寻所有META/Spring.factories配置文件,并将其中org.springframework.boot.autoconfigure.EnableAutoConfiguration对应得配置项,也就是一个自动配置类列表加载到IOC容器中。
    • @EnableAutoConfiguration让Springboot根据类路径下的jar包依赖为当前项目进行自动配置。
    • 对于所有标注@Configuration的配置类,统一使用ConfigurationClassParser解析的。
  • @ComponentScan
    • 自动扫描并加载符合条件的组件或者bean定义。