springboot随笔4.0:核心启动类上边的注解

问题1:springboot启动的时候如何筛选那些bean是需要实例化的/选择那些组件进行自动配置?

Spring Boot应用的启动入口是@SpringBootApplication注解标注类中的main()方法。

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

@SpringBootApplication注解作用

注解功能是把标注的类作为springboot的核心启动类。
SpringBootApplication是一个组合注解
其中三个主要注解分别为: @SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan三个核心注解。

@SpringBootConfiguration

功能:标注在某一个类上,表示这是springboot的配置类。
@SpringBootConfiguration也是一个组合注解,注解内部有一个核心注解@Configuration,该注解是由spring提供的,表示当前类为一个配置类,可以被组件扫描器扫描。
由此可见,@SpringBootConfiguration注解的作用与@Configuration注解相同,都是标识一个可以被组件扫描器扫描的配置类,只不过@SpringBootConfiguration是被Spring Boot进行了重新封装命名。

EnableAutoConfiguration(选择那些组件进行配置的关键注解)

功能:表明启动自动配置功能/筛选启动时需要加载的组件

packageorg.springframework.boot.autoconfigure;
          // 自动配置包
    @AutoConfigurationPackage
          // Spring的底层注解@Import,给容器中导入一个组件;
          // 导入的组件AutoConfigurationPackages.Registrar.class
    @Import(AutoConfigurationImportSelector.class)
    // 告诉SpringBoot开启自动配置功能,这样自动配置才能生效。
    public   @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY =  "spring.boot.enableautoconfiguration";
    // 返回不会被导入到 Spring 容器中的类
          Class[] exclude() default {};
        // 返回不会被导入到 Spring 容器中的类名
          String[] excludeName() default {};
}

Spring中有很多以Enable开头的注解,其作用就是借助@Import来收集并注册特定场景相关的Bean,并加载到IOC容器。
作用解析:
1.2.1.@AutoConfigurationPackage:加载AutoConfigurationPackages.Registrar.class组件类导入到容器中。组件的作用:AutoConfigurationPackages.Registrar这个类就干一个事,注册一个Bean,这个Bean就是org.springframework.boot.autoconfigure.AutoConfigurationPackages.BasePackages,它有一个参数,这个参数是使用了@AutoConfigurationPackage这个注解的类所在的包路径,保存自动配置类以供之后的使用,比如给JPA entity扫描器用来扫描开发人员通过注解@Entity定义的entity类。
1.2.2.主要注解@Import(AutoConfigurationImportSelector.class)
AutoConfigurationImportSelector这个类导入到容器中,这个类可以将符合条件的所有的@Configuration配置都加载到当前springboot创建并使用的ioc容器中。
通过遍历jar包下的META-INF/spring.factories下的文件内容(spring.factories里面保存着springboot的默认提供的自动配置类)来获取启动类的全路径,再exclude和filter进行过滤,最后将符合条件的自动配置类返回保存在一个list中。
补充:SpringFactoriesLoader#getSpringFactoriesInstances(AutoConfigurationImportSelector.class)
META-INF/spring.factories中的内容 是根据传入的class的类型获取对应的全限定类名(类似于key/value的形式)
filter过滤:调用AutoConfigurationImportFilter接口的match方法来判断每一个自动配置类上的条件注解(若有的话)@ConditionalOnClass,@ConditionalOnBean或@ConditionalOnWebApplication是否满足条件,若满足,则返回true,说明匹配,若不满足,则返回false说明不匹配。

ComponentScan

作用:主要是从定义的扫描路径中,找出标识了需要装配的类自动装配到spring 的bean容器中。

  • basePackages、value:指定扫描路径,如果为空则以@ComponentScan注解的类所在的包为基本的扫描路径
  • basePackageClasses:指定具体扫描的类
  • includeFilters:指定满足Filter条件的类
  • excludeFilters:指定排除Filter条件的类

你可能感兴趣的:(springboot随笔4.0:核心启动类上边的注解)