当前位置 博文首页 > blackball1998的博客:批量添加Bean

    blackball1998的博客:批量添加Bean

    作者:[db:作者] 时间:2021-06-20 12:09

    批量添加Bean

    除了使用@Component注解,或者@Configuration+@Bean注解添加Bean,还有一种方式可以批量添加Bean,就是使用@Import注解

    @Import

    @Import注解添加在自定义的配置类上,在注解的属性中设置一个或多个需要添加的组件的Class类即可将这些组件添加到容器中

    首先我们定义三个类,并且不添加@Component注解

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Person {
    
        private int age;
        private String name;
    }
    
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class School {
    
        private String name;
    }
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Car {
    
        private String brand;
        private String color;
    }
    

    定义一个自定义配置类,然后使用@Import注解将以上三个类都作为Bean添加到容器中

    @Configuration
    @Import({Person.class, Car.class, School.class})
    public class MyConfiguration {
        
    }
    

    测试容器中是否有这几个Bean

     @SpringBootTest
    class DemoApplicationTests {
        @Autowired
        ApplicationContext context;
    
        @Test
        void contextLoads() {
            String[] names = context.getBeanDefinitionNames();
            for (String name : names) {
                System.out.println(name);
            }
        }
    
    }
    

    测试结果如下

    在这里插入图片描述

    可以看到这三个Bean都被批量添加到容器中,而且Bean的名称为全路径限定名

    ImportSelector接口

    除此之外,@Import注解还提供了另一种批量添加Bean的方式,就是使用ImportSelector接口,这种方式虽然开发中使用不多,但是再Spring Boot底层在做自动配置时大量使用了这种方式,如果要深入了解Spring Boot,有必要了解一下这个接口

    定义一个ImportSelector接口的实现类,重写selectImports方法,方法返回一个字符串数组,将需要添加的组件的全路径限定名加入到数组中就可以把组件批量添加到容器中

    public class MySelector implements ImportSelector {
        @Override
        public String[] selectImports(AnnotationMetadata annotationMetadata) {
            return new String[]{"com.blackball.entity.Car", "com.blackball.entity.Person", "com.blackball.entity.School"};
        }
    }
    

    然后使用@Import注解的方式引入ImportSelector接口的实现类

    @Configuration
    @Import(MySelector.class)
    public class MyConfiguration {
        
    }
    

    测试结果跟使用@Import注解批量添加组件一样,注意使用这种方式的时候,ImportSelector接口的实现类本身并不会添加到容器中

    下一篇:没有了