@Import注解:向容器中快速注册一个组件

383 阅读1分钟

@Import注解:向容器中快速注册一个组件

向容器中注册组件的方法

  1. 使用包扫描+标注注解(@Service,@Controller...)
  2. 使用@Bean导入第三方包中的组件
  3. @Import注解

接下来详细说下@Import注解

首先我们创建一个配置类Congfig.java

@Configuration
public class Config {}

直接使用@Import注解

首先创建一个类:Day.java

public class Day {
    public void process(){
        System.out.println("I am day");
    }
}

注册一Day的实例注册到IOC容器

@Configuration
@Import(Day.class)
public class Config {}

这样会有Day的实例到IOC容器,并且bean的id默认是全类名

使用ImportSelector注册bean

ImportSelector是一个接口,创建一个实现ImportSelector的类MyImportSelector.java

public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{"com.pose.bean.Day"};
    }	
}

MyImportSelector需要实现一个名为selectImports的方法,该方法返回需要导入的组件的全类名的数组.接下来我们在配置类中加上MyImportSelector

@Configuration
@Import({MyImportSelector.class})
public class Config {}

再来看一下selectImports方法,它接收一个AnnotationMetadata的对象,这个对象包含了使用@Import注解的类的所有注解数据,也就是Config类的所有注解数据

使用ImportBeanDefinitionRegistrar接口注册BeanDefinition到IOC容器

创建一个实现ImportBeanDefinitionRegistrar的类MyImportBeanDefinitionRegistrar,将一个名称为day的BeanDefinition注册到容器中

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {

        final RootBeanDefinition definition = new RootBeanDefinition(Day.class);
        registry.registerBeanDefinition("day",definition);
    }
}
@Configuration
@Import({MyImportBeanDefinitionRegistrar.class})
public class Config {}