实现ImportSelector类→ 动态加载bean → 源码中大量使用
代码
package com.qing.config;
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;
import java.util.Map;
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata metadata) {
//metadata元数据 : 指的是加载本类MyImportSelector的类
//metadata的get、has、is 有大量方法,可以用来获取判断数据
Map<String, Object> annotationAttributes = metadata.getAnnotationAttributes("org.springframework.context.annotation.ComponentScan");
System.out.println("注解"+annotationAttributes);
boolean hasConfiguration = metadata.hasAnnotation("org.springframework.context.annotation.Configuration");
if(hasConfiguration){
return new String[]{"com.qing.bean.cat"};
}
return new String[]{"com.qing.bean.dog"};
}
}
元数据metadata指的是下面的config6
package com.qing.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
//@Configuration 注解是测试用的
@Configuration
//@ComponentScan 注解是测试用的
@ComponentScan("com.qing.bean")
@Import(MyImportSelector.class)
public class SpringConfig6 {
}
测试
package com.qing.app;
import com.qing.config.SpringConfig6;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class App6 {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig6.class);
String[] names = ctx.getBeanDefinitionNames();
for (String name : names) {
System.out.println("bean的名字:" + name);
}
}
}
结果
因为元数据上有@Configuration注解,所以返回的是cat
元数据上没有@Configuration注解了,所以返回的是dog
总结