Java 在运行时导入@Configuration

Java 在运行时导入@Configuration,java,spring,configuration,Java,Spring,Configuration,假设我有两个spring@Configuration类: @Configuration public class Config1 { @Bean public SomeInterface getSomeInterface() { return SomeImpl1; } } @Configuration public class Config2 { @Bean public SomeInterface getSomeInterface() {

假设我有两个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)
   }
}

您可以在配置类级别使用
@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
,但只有具有正确配置文件的类才会被加载。

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

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

另一种方法是在运行时创建config类,如中所述。

是的,我熟悉这个解决方案。实际上,这个问题是在一次技术讲座中提出的,我在讲座中解释了
@Configuration
,这就是我给出的答案。但是我想知道是否有一种方法可以用一个简单的
if
来实现。个人资料中有些东西人们通常不喜欢。不太清楚。@Avi我不知道,但可能无法使用配置类。我对你的问题很感兴趣,所以我想得到一个大师的答案:)也许看看这个源代码会有用:让我们等着看大师是否回答:)