- 直接传入我们需要导入的Class对象
@Import(PowerBean.class)
@Configuration
public class ImportAppConfig {
}
使用这种方式Spring会给我们导入PowerBean这个BeanDefinition,并且beanDefinitionName为它的全类名。它使用的是无参数构造方法给容器中注册组件,并且beanDefinitionName为组件的全类名。
- 使用@Import(ImportSelector.class)的方式
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
String[] beans = {"com.wanna.bean.bean.PowerBean"};
return beans;
}
}
使用这种方式我们可以实现ImportSelector接口,重写electImports接口,返回一个字符串数组(放的是全类名),从而给容器中注册一些组件,注册的组件的beanDefinitionName就是组件的全类名
@Import(MyImportSelector.class)
@Configuration
public class ImportAppConfig {
}
- 使用@Import(ImportBeanDefinitionRegistrar.class)的方式
我们使用如下的方式去自定义我们自己的ImportBeanDefinitionRegistrar,并通过重写registerBeanDefinitions方法给我们容器中注入组件,通过BeanDefinitionRegistry来给容器中注册组件,在注册时可以指定beanDefinitionName。
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
RootBeanDefinition bd = new RootBeanDefinition();
bd.setBeanClass(BookBean.class);
registry.registerBeanDefinition("bookBean", bd);
}
}
使用如下的方式导入我们自己的ImportBeanDefinitionRegistrar。
@Import(MyImportBeanDefinitionRegistrar.class)
@Configuration
public class ImportAppConfig {
}
我们就能将我们自己的BeanDefinition注册到容器中,这种方式在SpringAOP/SpringBoot中都在进行使用。