Java 在运行时导入@Configuration
假设我有两个spring@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() {
@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我不知道,但可能无法使用配置类。我对你的问题很感兴趣,所以我想得到一个大师的答案:)也许看看这个源代码会有用:让我们等着看大师是否回答:)