Spring Boot 自动配置

42 阅读1分钟

Spring Boot 的自动配置就是当 Spring 容器启动之后,一些配置类,Bean 对象等就自动存入了 IoC 容器,不用手动的去声明。

当我们需要使用一些第三方的类时,有以下几种方式:

第一种方法是通过@ComponentScan注解指定扫描路径

第二种方法是把要使用的包导进来,然后通过@Import注解来执行类

第三种方法是,在第三方那里通过实现 ImportSelector 接口,来把要扫描的类进行管理:

public class MyImport implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{"com.example.myconfig.BeanConfig"};
    }
}

上面的方法都有些麻烦

第四种方法是,第三方提供一个注解,调用方通过添加注解来使用:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(MyImport.class)
public @interface EnableMyConfig {
}

最后一种方法是在 resource 目录下创建 META-INF.spring 目录,然后创建一个 org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件,把要管理的 Bean 的路径写在这里

对于这种 Spring 已经管理的对象,@ConditionalOnClass注解指定了只有包含哪些类,才会自动配置,创建对象,这也就是只有引入相应依赖,才能使用对应的类的原因

此外还发现,源码中的 @Import注解中的 Registrar 类实现的是 ImportBeanDefinitionRegistrar 接口,所以上面通过@Import实现的那种方式也可以来实现这个接口进行配置:

大概的流程就是