在运行时导入@Configuration

时间:2014-05-01 12:44:11

标签: java spring configuration

假设我有2个Spring @Configuration类:

@Configuration
public class Config1 {
   @Bean
   public SomeInterface getSomeInterface() {
      return SomeImpl1;
   }
}


@Configuration
public class Config2 {
   @Bean
   public SomeInterface getSomeInterface() {
      return SomeImpl2;
   }
}

通常在我的根上下文类中,我会做这样的事情:

@Import(Config1.class)
@Configuration
public class RootConfig {
   ...
}

当然,我也可以使用Config2

但是,如果我想选择在运行时加载哪一个而不使用@Import,该怎么办?类似的东西:

@Configuration
public class RootConfig {
   @DynamicImports // Made-up annotation
   public void loadConfigs() {
      // Do some logic here that imports Config1 or Config2 dynamically by some parameters (for example, env param)
   }
}

2 个答案:

答案 0 :(得分:1)

您可以在配置类级别使用@Profile

@Configuration
@Profile("dev")
public class DevConfig {
}

@Configuration
@Profile("prod")
public class ProdConfig {
}

然后您可以通过不同方式激活当前的个人资料。例如,在测试类中:

@ActiveProfiles("dev")
public class DevIntegrationTest 

在这种情况下,您将当前活动的配置文件设置为dev,并且仅加载@Profile("dev")带注释的类。

您还可以将当前活动配置文件设置为参数jvm:

-Dspring.profiles.active="dev"

继续使用您的@Import,但只会加载具有正确个人资料的类。

答案 1 :(得分:0)

在我看来,当您引用上下文时,只能手动执行。例如:

var diContext = new AnnotationConfigWebApplicationContext();
diContext.register(FirstConfig.class);
diContext.register(SecondConfig.class);
...

另一种方法是在运行时创建配置类,如this answer中所述。