【问题标题】:Rule out beans governed by Multiple spring @Profiles at same time排除同时由多个 spring @Profiles 管理的 bean
【发布时间】:2016-07-22 14:28:35
【问题描述】:

是否可以根据我传递给应用程序的参数来控制我的应用程序上下文中的 Spring bean 是否被实例化?

示例:

如果我在

中设置了弹簧配置文件

ANT 的 build.xml jvmarg 为: -Dspring.profiles.active=P1,P2

对于配置类中的以下代码sn-p:

@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 都已定义)?

【问题讨论】:

    标签: java spring spring-boot


    【解决方案1】:

    配置文件可能不适合这个。

    您可以只使用普通属性。

    检查@Conditional 注释(Spring 4)和更方便的@ConditionalOnExpression("${P1}")(仅在 Spring 引导中可用)。

    另一种选择 - @Configuration 类中的一些手动逻辑,例如:

    @Value("${P1}") boolean isP1;
    
    @Bean String p1OrP2() {
        return (isP1) ? "P1" : "P2";
    }
    

    这对于常见情况可能已经足够了,例如通过这种方式,您可以控制是否使用某些功能(使用完整的实现 bean)或不使用(使用行为最少的 bean)。

    【讨论】:

    • 还可以看看Spring Boot中的@ConditionalOnProperty注解。
    【解决方案2】:

    通过混合 ServiceLocatorFactoryBean 和 Spring Profiles 的概念,我能够通过共享的编排代码库解决为各种业务服务的应用程序的按需引导问题。

    链接: http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/factory/config/ServiceLocatorFactoryBean.html http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html

    Spring 配置文件帮助创建环境/应用程序上下文中指定的按需 bean,并且定位器工厂创建实现该接口的动态代理,委托给底层 BeanFactory,因此通过使用从 BeanFactory API 中解耦调用代码适当的自定义定位器界面

    【讨论】:

      猜你喜欢
      • 2014-10-28
      • 2018-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多