当前位置 博文首页 > blackball1998的博客:批量添加Bean
除了使用@Component
注解,或者@Configuration
+@Bean
注解添加Bean,还有一种方式可以批量添加Bean,就是使用@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的名称为全路径限定名
除此之外,@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
接口的实现类本身并不会添加到容器中