在运行时导入@Configuration

4

假设我有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个回答

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,但只有正确配置文件的类才会被加载。


是的,我熟悉这个解决方案。实际上,在一个技术讨论中,我解释了关于@Configuration的内容,并给出了答案。但我想知道是否有一种用简单的if来实现它的方法。人们通常不喜欢配置文件中的某些内容,因为它不太清晰。 - Avi
@Avi 我不确定,但也许使用配置类是不可能的。我对你的问题很感兴趣,所以我会等待大师的答案 :) 也许查看这个源代码会有用:https://github.com/spring-projects/spring-framework/blob/master/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java - gipinani
让我们拭目以待,看看是否有大师解答 :) - Avi

0

在我看来,只有在具备上下文的参考时才能手动完成它。例如:

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

另一种方法是在运行时创建配置类,就像这个答案中所描述的那样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接