@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)); } } }