一、@Import方式一:直接导入
1、创建两个类测试
2、在spring全局配置类中进行配置(@Import可导一个和多个组件,导入后组件的id为全类名)
//配置类==配置文件 @Configuration //告诉Spring这是一个配置类 @Import({Color.class,Animal.class}) //@Import 【快速给容器中导入组件】 public class MainConfig { }
3、测试
@Test public void test01() { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class); //getBeanDefinitionNames获取容器中组件的name(即配置文件中组件的id) String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames(); for (String name : beanDefinitionNames) { System.out.println(name); } }
结果:
说明注入成功,另外用@Import导入的组件默认id时全类名
二、@Import方式二:利用ImportSelector 自定义逻辑导入组件
1、再创建两个类
2、创建自定义导入选择器(实现ImportSelector接口)
//自定义逻辑返回需要导入的组件 public class MyImportSelector implements ImportSelector { //返回值,就是要导入到容器中的组件的全类名数组 @Override public String[] selectImports(AnnotationMetadata annotationMetadata) { //....中间进行逻辑选择 //不要返回null,不然会报空指针异常,值必须为全类名 return new String[]{"com.atguigu.bean.Red","com.atguigu.bean.Yellow"}; } }
3、修改spring配置类
@Configuration //告诉Spring这是配置类 @Import({Color.class,Animal.class,MyImportSelector.class}) //@Import 【快速给容器中导入组件】 public class MainConfig { }
导入自定义导入选择器后再再在运行方法中测试结果:
三、@Import方式三:ImportBeanDefinitionRegistrar 手动注册bean到容器中
1、再创建一个类
2、自定义实现BeanDefinitionRegistrar接口的类(判断如果容器中有Id为com.atguigu.bean.Animal的组件,则注册cat组件)
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { /** * AnnotationMetadata:当前类的注解信息 * BeanDefinitionRegistry:BeanDefinition注册类: * 把要添加到容器中的bean,调用BeanDefinitionRegistry.registerBeanDefinition手动注册进来 */ @Override public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) { //简单逻辑判断 //判断是否有这个组件,注意containsBeanDefinition这个方法是根据组件id查询 boolean definition = beanDefinitionRegistry.containsBeanDefinition("com.atguigu.bean.Animal"); //有上面这个组件则... if(definition) { //注册组件进入容器,可自己指定组件名 RootBeanDefinition beanDefinition = new RootBeanDefinition(Cat.class); beanDefinitionRegistry.registerBeanDefinition("cat", beanDefinition); } } }
3、修改spring配置类
//配置类==配置文件 @Configuration //告诉Spring这是配置类 @Import({Color.class,Animal.class,MyImportSelector.class,MyImportBeanDefinitionRegistrar.class}) //@Import 【快速给容器中导入组件】 public class MainConfig { }
再次运行测试方法结果为(因为我们有Id为com.atguigu.bean.Animal的组件,所以cat组件也能创建成功)