假设我有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)
}
}
答案 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中所述。