先建三个@Component
@Component
public class A{
}
@Component
public class B{
}
@Component
public class C{
}
再建三个@Configuration
@Configuration
public class AConfig {
@Bean(name="a")
public A a(){
return new A();
}
}
@Configuration
public class BConfig {
@Bean(name="b")
public B b(){
return new B();
}
}
@Configuration
public class CConfig {
@Bean(name="c")
public C c(){
return new C();
}
}
Import出场
先建三个@Component
@Component
public class A{
}
@Component
public class B{
}
@Component
public class C{
}
再建三个@Configuration
@Configuration
public class AConfig {
@Bean(name="a")
public A a(){
return new A();
}
}
@Configuration
public class BConfig {
@Bean(name="b")
public B b(){
return new B();
}
}
@Configuration
public class CConfig {
@Bean(name="c")
public C c(){
return new C();
}
}
1.普通方式
Import出场
@Configuration
@Import({AConfig.class, BConfig.class, CConfig.class})
public class TotalConfig {
}
类似三个子配置,这里弄了个总配置,比较像之前xml配置文件形式,总的配置文件import几个子配置文件,放一起比较乱
2 ImportSelector接口方式
public class ABCSelector implements ImportSelector{
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.spring.config.AConfig","com.spring.config.BConfig",,"com.spring.config.CConfig"};
}
}
@Configuration
@Import(ABCSelector.class)
public class TotalConfig {
}
3 ImportBeanDefinitionRegistrar接口方式
public class ABCImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar{
@OverrideA
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry registry) {
RootBeanDefinition rootBeanDefinitionA = new RootBeanDefinition(A.class);
registry.registerBeanDefinition("a123",rootBeanDefinitionA);//自定义注册beana
RootBeanDefinition rootBeanDefinitionB = new RootBeanDefinition(B.class);
registry.registerBeanDefinition("b123",rootBeanDefinitionA);//自定义注册beanb
RootBeanDefinition rootBeanDefinitionC = new RootBeanDefinition(C.class);
registry.registerBeanDefinition("c123",rootBeanDefinitionA);//自定义注册beanc
}
}
@Configuration
@Import(TestImportBeanDefinitionRegistrar.class)
public class TotalConfig {
}
4.区别
三种用法方式都可在一个@Import中使用,需要注意的是第一种、第二种方式在IOC容器中bean名称是类的全类名,而第三种方式是自定义的名称。
@Import({{AConfig.class, BConfig.class, CConfig.class,ABCSelector.class,ABCImportBeanDefinitionRegistrar.class}})
@Configuration
public class TotalConfig {}