Spring Boot: ImportSelector接口

在Spring Boot中,ImportSelector是一个允许动态选择和导入配置类的接口,它的主要作用是根据某些条件动态决定哪些配资类需要被导入Spring应用的上下文中。

接口定义

public interface ImportSelector {
    String[] selectImports(AnnotationMetadata importingClassMetadata);
}

参数AnnotationMetadata:表示使用了@Import注解的类的元数据,方法返回一个字符串数组,每个字符串对应一个需要导入的配置类的全限定名。

作用过程 当Spring boot启动时,它会扫描到使用了@Import注解的类,ImportSelector会根据传入的元数据决定需要导入的配置类,并将这些类注册到Spring上下文中。

应用场景

  1. 当基于条件(如环境变量、JVM系统属性等)动态导入配置类时;
  2. 在创建自定义的启动注解(如@EnableSomeFuture)时,通过ImportSelector来导入现骨干的配置类;
  3. Spring框架本身在多个地方使用ImportorSelector来简化客户端的配置负担,如@EnableAsync@EnableScheduling

示例

import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        // 基于条件选择配置类
        String prop = System.getProperty("myProp");
        if ("someValue".equals(prop)) {
            return new String[]{MyConfig1.class.getName()};
        } else {
            return new String[]{MyConfig2.class.getName()};
        }
    }
}

@Configuration
public class MyConfig1 {
    @Bean
    public AppBean appBean() {
        return new AppBean("from config 1");
    }
}

@Configuration
public class MyConfig2 {
    @Bean
    public AppBean appBean() {
        return new AppBean("from config 2");
    }
}

public class AppBean {
    private String message;
    public AppBean(String message) {
        this.message = message;
    }
    public String getMessage() {
        return message;
    }
}

@Configuration
@Import(MyImportSelector.class)
public class MainConfig {
    // 主配置类
}

发表回复

您的电子邮箱地址不会被公开。