SpringBoot中的ImportSelector类动态加载bean详解
作者:梨轻巧
这篇文章主要介绍了SpringBoot中的ImportSelector类动态加载bean详解,ImportSelector接口是spring中导入外部配置的核心接口,根据给定的条件(通常是一个或多个注释属性)判定要导入那个配置类,在spring自动化配置和@EnableXXX中都有它的存在,需要的朋友可以参考下
ImportSelector类动态加载bean
实现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

总结

到此这篇关于SpringBoot中的ImportSelector类动态加载bean详解的文章就介绍到这了,更多相关ImportSelector类动态加载bean内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
