@Import:快速给容器中导入一个组件。
@Import导入组件,id默认是组件的全类名。
源码:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
/**
* {@link Configuration}, {@link ImportSelector}, {@link ImportBeanDefinitionRegistrar}
* or regular component classes to import.
*/
Class<?>[] value();
}
1)、@Import(要导入到容器中的组件);容器中就会自动注册这个组件,id默认是全类名
2)、ImportSelector:返回需要导入的组件的全类名数组;
3)、ImportBeanDefinitionRegistrar:手动注册bean到容器中。
测试:
public class Color {
private Car car;
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
@Override
public String toString() {
return "Color [car=" + car + "]";
}
}
配置类:
@Configuration
@Import({Color.class})
//@Import导入组件,id默认是组件的全类名
public class MainConfig2 {
}
测试类:
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);
@Test
public void testImport(){
printBeans(applicationContext);
}
private void printBeans(AnnotationConfigApplicationContext applicationContext){
String[] definitionNames = applicationContext.getBeanDefinitionNames();
for (String name : definitionNames) {
System.out.println(name);
}
}
结果:
ImportSelector:返回需要导入的组件的全类名数组;从而向容器中注入该组件。
如:
public class Blue {
public Blue(){
System.out.println("blue...constructor");
}
public void init(){
System.out.println("blue...init...");
}
public void detory(){
System.out.println("blue...detory...");
}
}
//自定义逻辑返回需要导入的组件名称
public class MyImportSelector implements ImportSelector {
//返回值:就是要导入容器中的组件全类名
//AnnotationMetadata:就是当前标注@Import注解的类的所有注解信息
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
Set<String> annotationTypes = importingClassMetadata.getAnnotationTypes();
annotationTypes.stream().forEach(s ->
System.out.println(s));
return new String[]{"com.spring.bean.Blue"};
}
}
配置类:
@Configuration
@Import({MyImportSelector.class})
//@Import导入组件,id默认是组件的全类名
public class MainConfig2 {
}
测试类:
@Test
public void testImport(){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);
Blue bean = applicationContext.getBean(Blue.class);
System.out.println(bean);
}
结果:
ImportBeanDefinitionRegistrar:手动注册bean到容器中。
测试:
public class RainBow {
}
public class Person {
private String name;
private Integer age;
private String nickName;
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Person(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
public Person() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", nickName=" + nickName + "]";
}
}
设置类:
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
/**
* AnnotationMetadata:当前类的注解信息
* BeanDefinitionRegistry:BeanDefinition注册类
* 把所有需要注册到容器中bean调用
* BeanDefinitionRegistry.registerBeanDefinition手动注册到容器中
*/
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
boolean definition = registry.containsBeanDefinition("person");
if(definition){
//指定的定义信息(bean的类型)
RootBeanDefinition beanDefinition = new RootBeanDefinition(RainBow.class);
//注册一个bean指定bean的名称
registry.registerBeanDefinition("rainBow", beanDefinition);
}
}
}
配置类:
@Configuration
@Import({MyImportBeanDefinitionRegistrar.class})
public class MainConfig2 {
/**
* 注册person对象
* @return
*/
@Bean("person")
public Person person(){
System.out.println("给容器添加person....");
return new Person("person", 25);
}
}
测试类:
@Test
public void testImport(){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);
Person bean = applicationContext.getBean(Person.class);
System.out.println(bean);
RainBow rainBow = applicationContext.getBean(RainBow.class);
System.out.println(rainBow);
}
结果: