我可以控制应用程序上下文中的 Spring bean 是否根据我传递给应用程序的参数进行实例化吗?
示例:
如果我在
中设置了 Spring 配置文件ANT 的 build.xml jvmarg 为:
-Dspring.profiles.active=P1,P2
对于配置类中的以下代码片段:
@Bean
@Profile({"!P1", "!P2"})
public String P3() {
String s = "Check1:P3";
System.out.println(s);
return s;
}
@Bean
@Profile({"!P1", "!P3"})
public String P2() {
String s = "Check2:P2";
System.out.println(s);
return s;
}
@Bean
@Profile({"!P2", "!P3"})
public String P1() {
String s = "Check3:P1";
System.out.println(s);
return s;
}
@Bean
@Profile("P3")
public String P3_1() {
String s = "Check4:P3";
System.out.println(s);
return s;
}
@Bean
@Profile("P1")
public String P1_1() {
String s = "Check5:P1";
System.out.println(s);
return s;
}
@Bean
@Profile("P2")
public String P2_1() {
String s = "Check6:P2";
System.out.println(s);
return s;
}
我得到的输出为:
Check2:P2
Check3:P1
Check5:P1
Check6:P2
这是正确的。
但是当我将 build.xml 中的配置文件设置为:
-Dspring.profiles.active=P1
Output:
Check1:P3
Check2:P2
Check3:P1
Check5:P1
但按照我的预期,我希望得到如下输出:
Check3:P1
Check5:P1
(即)只有 P1() bean 在运行时启动。
如果@Profiles 可以的话,有人可以建议我吗? 我可以根据配置文件的排除规则来控制运行时启动的bean吗? 或者我怎样才能实现这个目标?
基本要求是是否有“n”个bean。我可以根据传递给环境/服务器目标的参数控制 1 个 bean 在运行时启动。
我正在尝试使用一个共享代码(其中定义了所有bean),该代码可以由不同的环境使用(每个特定环境需要一个bean)?
最佳答案
配置文件可能不适合这样做。
您可以只使用普通属性。
检查@Conditional注释(Spring 4),甚至更方便的@ConditionalOnExpression("${P1}")(仅在Spring boot中可用)。
另一个选项 - @Configuration 类中的一些手动逻辑,例如:
@Value("${P1}") boolean isP1;
@Bean String p1OrP2() {
return (isP1) ? "P1" : "P2";
}
这对于常见情况可能就足够了,例如这样您就可以控制是否使用某些功能(使用完整的实现 bean)或不使用(使用某些具有最小行为的 bean)。
关于java - 排除同时受多个 spring @Profiles 控制的 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38528982/