Spring Boot: ImportSelector接口
在Spring Boot中,ImportSelector
是一个允许动态选择和导入配置类的接口,它的主要作用是根据某些条件动态决定哪些配资类需要被导入Spring应用的上下文中。
接口定义
public interface ImportSelector {
String[] selectImports(AnnotationMetadata importingClassMetadata);
}
参数AnnotationMetadata:表示使用了@Import
注解的类的元数据,方法返回一个字符串数组,每个字符串对应一个需要导入的配置类的全限定名。
作用过程 当Spring boot启动时,它会扫描到使用了@Import
注解的类,ImportSelector
会根据传入的元数据决定需要导入的配置类,并将这些类注册到Spring上下文中。
应用场景
- 当基于条件(如环境变量、JVM系统属性等)动态导入配置类时;
- 在创建自定义的启动注解(如
@EnableSomeFuture
)时,通过ImportSelector
来导入现骨干的配置类; - 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 {
// 主配置类
}
发表回复