Import支持直接import配置类、ImportSelector子类(配置类选择器)、ImportBeanDefintionRegistra(在扫描到某个Configuration时需要额外注入某个bean)
ImportSelector配置类选择器
- ImportSelector(配置类选择器),可以与各种Aware实现类(如EnvironmentAware、BeanFactoryAware等)合作且其selectImport方法会最后执行。
- 如果需要所有Configuration配置类处理完后再导入ImportSelctor选中的配置类,需要使用DeferredImportSelector。
- 应用代码如下:ImportSelector可以根据@UseCache注解选择使用EhCacheConfiguration还是RedisConfiguration
EhCacheConfiguration.java,ehCache配置类:
public class EhCacheConfiguration {
@Bean(name = "ehCacheBean")
public Object getBean(){
return new EngineImpl("ehCache");
}
}
RedisCacheConfiguration.java redis配置类:
public class RedisConfiguration {
@Bean(name = "redisBean")
public Object getBean(){
return new EngineImpl("redis");
}
}
UseCache.java 注解:
@UseCache(name=”redis”) 表示ImportSelector将会选择RedisCacheConfiguration配置类进行注入,而不会注入EhCacheConfiguration
/**
* 使用哪个cache
*/
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Target(ElementType.TYPE)
public @interface UseCache {
String name() default "";
}
TestImport.java:
此处Import了TestImportSelector.class
@Import(value = {TestImportSelector.class})
@UseCache(name = "redis")
@Configuration
public class TestImport {
}
TestImportSelector.java:
/**
* 它不是一个bean,它只是Import选择器,一般告诉我们使用哪个@Configuration标注的类的class.getName
*/
public class TestImportSelector implements ImportSelector {
private static Map<String,Class<?>> configurationMap = null;
static {
Map<String,Class<?>> map = new HashMap<>();
map.put("redis", RedisConfiguration.class);
map.put("ehCache", EhCacheConfiguration.class);
configurationMap = Collections.unmodifiableMap(map);
}
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
System.out.println(importingClassMetadata);
Map<String, Object> useCache = importingClassMetadata.getAnnotationAttributes(UseCache.class.getName());
if ("redis".equals(useCache.get("name")))
return new String[]{RedisConfiguration.class.getName()};
return new String[]{EhCacheConfiguration.class.getName()};
}
@Override
public Predicate<String> getExclusionFilter() {
return null;
}
}