java - 排除同时受多个 spring @Profiles 控制的 bean

标签 java spring spring-boot

我可以控制应用程序上下文中的 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/

相关文章:

java - HttpServletRequest 到 MultipartHttpServletRequest : ClassCastException in Junit

java - Soap登录使用5个参数android

java - 如何有效地使用 Spring 的 JDBCTemplate 执行 IN() SQL 查询?

java - EnableOAuth2Client 已弃用

jpa - 具有应用程序管理的持久性上下文的Spring Boot

java - 如何找到sqlite的转义字符列表

Java boolean 返回 if 语句

java - 无法弄清楚 URIException

java - 以非静态方式创建 JUnit TestSuite

java - 如何使用 Spring Boot 设置 Spring JDBC 连接池?