@Import注解:向容器中快速注册一个组件
向容器中注册组件的方法
- 使用包扫描+标注注解(@Service,@Controller...)
- 使用@Bean导入第三方包中的组件
- @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 {}