SpringBoot中如何​​​​​​​导入配置?


有时我们需要在某个配置类中引入其他类,而导入的类也会被添加到spring容器中。这时,可以使用注解@Import来完成这个功能。

如果你看一下它的源代码,你会发现导入的类支持三种不同的类型。

但我认为最好分别解释普通类和@Configuration注解的配置类,所以列出了四种不同类型。

1、普通类
这种引入方法是最简单的,导入的类将被实例化为一个bean对象。

public class A {
}

@Import(A.class)
@Configuration
public class TestConfiguration {
}

通过@Importannotations引入A类,spring可以自动实例化A对象,然后通过注解在需要使用的地方@Autowiredinject它们:

@Autowired
private A a;

这是否令人惊讶?@Bean可以在没有注解的情况下被实例化。

2、 配置类
这种介绍方法是最复杂的,因为@Configurationannotations还支持各种组合注解,如:

  • @Import
  • @ImportResource
  • @PropertySource

public class A {
}

public class B {
}

@Import(B.class)
@Configuration
public class AConfiguration {

    @Bean
    public A a() {
        return new A();
    }
}

@Import(AConfiguration.class)
@Configuration
public class TestConfiguration {
}


用@Configuration注解的配置类是通过@Import注解导入的,与配置类相关的注解@Import、@ImportResource所引入的类将被一次性递归引入。

3、 ImportSelector
这个导入方法需要实现ImportSelector接口

public class AImportSelector implements ImportSelector {

private static final String CLASS_NAME = "com.sue.cache.service.test13.A";
    
 public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{CLASS_NAME};
    }
}

@Import(AImportSelector.class)
@Configuration
public class TestConfiguration {
}

这个方法的好处是,selectImports方法返回一个数组,这意味着可以同时引入多个类,这非常方便。

4、 ImportBeanDefinitionRegistrar
这个导入方法需要实现ImportBeanDefinitionRegistrar接口。

public class AImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(A.class);
        registry.registerBeanDefinition("a", rootBeanDefinition);
    }
}

@Import(AImportBeanDefinitionRegistrar.class)
@Configuration
public class TestConfiguration {
}

这个方法是最灵活的。容器注册对象可以在该方法中获得registerBeanDefinitionsobtained,BeanDefinition的创建和注册可以手动控制BeanDefinitionRegistry