一、写一个@Configuration
@Configuration
@Service
public class CarConfiguration {
@Bean
public Benz getBenz() {
return new Benz();
}
@Bean
public toyato gettoyato() {
return new toyato();
}
}
二、写一个@EnableSelector
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(CarConfigSelector.class) //选择器返回的是类对象的名称(0、多)
public @interface EnableCarSelector {
}
三、实现接口进行扩展
public class CarConfigSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
System.out.println("注解的元数据annotationMetadata"+annotationMetadata);
System.out.println("注解的元数据annotationMetadata.getClassName=="+annotationMetadata.getClassName());
System.out.println("CarConfiguration.class.getName()=="+CarConfiguration.class.getName());
String arr[] = new String[1];
//arr[0] = CarConfiguration.class.getName();
//arr[1] = BookConfiguration.class.getName();
//String s = annotationMetadata.getClassName();
boolean anno = annotationMetadata.hasAnnotation("com.wgc.annotationmetadata.config.EnableCarSelector");
System.out.println("--boolean"+anno);
// if (s.contains("CarConfig") == true) { //运行的类包含这个字眼
// arr[0] = CarConfiguration.class.getName();
// } else {
// arr[0] = BookConfiguration.class.getName();
// }
if (anno == true) {
arr[0] = CarConfiguration.class.getName();
} else {
arr[0] = BookConfiguration.class.getName();
}
return arr;
}
}
四、测试
根据选择器的条件判断,返回通过注册的对象
//有类对象才能拿注解,程序入口
//没有@ComponentScan,@Import,这个容器是扫不了东西拿不了东西的
//这个注解最终就是通过选择器判断拿到相应对象,也就是返回类名,有了这个类名就相当于拿到类对象
@EnableCarSelector
public class TestCarConfigSelector {
public static void main(String[] args) {
ConfigurableApplicationContext context = new SpringApplicationBuilder(TestCarConfigSelector.class)
.web(WebApplicationType.NONE)
.run(args);
System.out.println("丰田奔驰Configuration-----");
Benz benz = context.getBean("getBenz", Benz.class);
System.out.println(benz.Introduce());
System.out.println("书Configuration------");
String java = context.getBean("java", String.class);
System.out.println("java="+java);
context.close();
}
}