【问题标题】:Autowire Spring Bean based on boolean variable基于布尔变量的自动装配 Spring Bean
【发布时间】:2018-07-22 10:22:48
【问题描述】:

我想以这样一种方式配置 spring bean,即根据布尔变量的值,两个可用的连接 bean 之一在代码中自动装配。

下面是布尔变量的初始化:

//This is overridden as false from the properties file on the server.
@Value(value = "${my.property.connectionOne:true}") 
private boolean connectionOne;

我是这样定义 Bean 的:

@Bean(name = "specificConnection")
public Destination getSpecificConnection() throws Exception {
    if (connectionOne) { //boolean variable
        return new ConnectionOne("DB");
    }
    else {
        return new ConnectionTwo("XML");
    }
}

其中ConnectionOneConnectionTwo 都实现了Destination

我正在使用所需类中的 bean:

@Autowired
@Qualifier(value = "specificConnection")
private Destination specificConnection;

但是,它似乎不起作用。即使我将布尔变量的值更改为 false,它也会一直返回 ConnectionOne

我使用的是 Spring 4.2.0 版和 Wildfly 服务器。

如果需要进一步说明,请告诉我。

【问题讨论】:

  • 显示connectionOne的初始化位置
  • 你确定connectionOne布尔值是假的吗?
  • connectionOne 变量的定义位置以及更改值的位置
  • 是的@Betlista,该属性已从服务器属性文件中覆盖。 @АлмасАбдразак 请看下面 //这是从服务器上的属性文件中覆盖的。 @Value(value = "${my.property.connectionOne:true}") private boolean connectionOne;
  • @АлмасАбдразак 编辑了我的原始代码以显示声明,因为注释的格式不正确。

标签: java spring


【解决方案1】:

这是弹簧型材的完美示例!看看这个链接:

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html

在 Spring 中,您可以定义程序将在其中运行的不同配置文件。根据您在 application.properties 中定义的设置,您的程序将使用这些配置文件的不同 bean。 :)

希望对你有帮助!

问候

噪音

【讨论】:

  • 这仅适用于 Spring Boot 应用程序还是适用于普通 Spring 应用程序?另外,使用分析我想我可以根据我的配置文件完全连接不同的 bean,但我可以使用相同的方法返回不同的结果吗?
  • @phoenixSid 我认为您需要弹簧靴,但它应该可供您使用。 davidxxx 应该有一个布尔值的 bean-creation 的正确答案。但是您应该提供一种在运行时更改此变量的方法。 :)
  • 是的,我们正计划逐步转向 spring-boot 架构,但在那之前,它的正常 spring 应用程序在 wildfly 中运行。
【解决方案2】:

我想配置 spring bean 的方式取决于 布尔变量的值

布尔变量必须在 Spring 初始化 specificConnection bean 之前赋值。 所以你应该做的是使用值表达式。

@Value("${isConnectionOne}") // looks the value in the available placeholder
private boolean isConnectionOne;

@Bean(name = "specificConnection")
public Destination getSpecificConnection() throws Exception {
    if (connectionOne) { //boolean variable
        return new ConnectionOne("DB");
    }
    else {
        return new ConnectionTwo("XML");
    }
}

【讨论】:

  • 我会按照你的方式。另一个替代方案是 beanfactory 概念。 Spring 提供了很多方法!
  • 对。如果它不是太复杂并且有意义,你可以证明:)
  • @davidxxx 我只是这样做。但它似乎仍然不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-27
  • 1970-01-01
  • 1970-01-01
  • 2018-02-28
  • 2020-09-09
  • 2018-06-15
相关资源
最近更新 更多