@Import 注解的学习
1、@Import注解的作用
通过手动导入的方式想IOC容器里面注入bean,这个注解的属性值放的是Class的数组
这里也可以把不在Spring Boot 的包扫描路径下的文件加载到容器里面
2、代码事例放不同类型的java类
放的类一定要有一个无参的构造器,否则会报错
@Import(默认的beanId是 全类名)
1)ImportSelector:接口返回值是需要导入的组件的全类名数组,实现了这个接口的类是不会导入到容器里面的 Springboot中用的很多
2)ImportBeanDefinitionRegistrar,通过手动的方式把需要放到容器里的类,放到容器里面,实现了这个接口的类是不会导入到容器里面的
3)通过ImportSelector 和 ImportBeanDefinitionRegistrar 被注入进容器里面的bean,必须有无参的构造器,否则报错注入不进去
如Color
2.1 放一个普通的java类
@Configuration
@Import({Color.class})
public class MainConfig {
}
public class Color {
public Color() {
}
private int num;
public Color(int num) {
this.num = num;
}
}
2.2 放一个实现了ImportSelector 接口的类
@Configuration
@Import({MyImportSelector.class})
public class MainConfig {
}
public class MyImportSelector implements ImportSelector {
//返回值就是需要向容器中注入的全类名
//importingClassMetadata 这个里面获取 使用@Import注解类的全部注解信息
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
Set<String> stringSet = importingClassMetadata.getAnnotationTypes();
Iterator iterator = stringSet.iterator();
// for (int i = 0; i < stringSet.size(); i++) {
// if(iterator.hasNext()){
// System.out.println(iterator.next());
// }
//
// }
return new String[]{"com.ali.sofa.gts.pojo.Blue"};
}
}
2.3 放一个实现了ImportBeanDefinitionRegistrar 接口的类
@Configuration
@Import({MyBeanDefinitionRegistry.class})
public class MainConfig {
}
public class MyBeanDefinitionRegistry implements ImportBeanDefinitionRegistrar {
/**
*
*
*
* @param importingClassMetadata 这个里面获取 使用@Import注解类的全部注解信息
* @param registry 注册类:用来注册bean的,把需要放到容器里面的类可以调用这个类的registerBeanDefinition方法
*/
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
Boolean b =registry.containsBeanDefinition("com.ali.sofa.gts.pojo.Red");
Boolean b1 =registry.containsBeanDefinition("com.ali.sofa.gts.pojo.Blue");
if(b && b1){
registry.registerBeanDefinition("yellow",new RootBeanDefinition(Yellow.class));
}
}
}
浙公网安备 33010602011771号