当前位置: 首页 > 知识库问答 >
问题:

基于@ConfigurationProperties值的Spring Bootbean

刘阳荣
2023-03-14

Spring Boot使用@ConfigurationProperties注释为我们提供了类型化的配置对象。使用Spring Boot annotation Processor时,其优点之一是可以免费在IDE中完成属性名。另一个是:验证。

现在,我想让bean以属性的值为条件。实际上,我有一个接口的两个实现,这个属性告诉我应该使用哪一个。我可以这样实现它:

implementation.java

@Component
@ConditionalOnProperty(name = "foo.bar", havingValue = "a")
public class ImplementationA implements SomeInterface { ... }
@Component
@ConditionalOnProperty(name = "foo.bar", havingValue = "b")
public class ImplementationB implements SomeInterface { ... }
foo:
  bar: "a"
@ConfigurationProperties(prefix = "foo")
public class FooProperties {

    private String bar;


    public String getBar() { ... }

    public void setBar(String bar) { ... }
}

这仍然可以工作,但是当我在这个类中为bar声明默认值时,@conditionalonproperty显然不会拾取它,因为这个注释直接(按照设计的)对环境操作。所以最好不要把这些概念混在一起。

是否有一种方法可以基于@ConfigurationProperties对象中的值来使用条件bean?最好使用一些@condition注释,而不创建@configurationbean,因为这意味着样板代码。

共有1个答案

郎成弘
2023-03-14

它可能没有那么性感,但一个潜在的解决方案可能是将您的配置自动加入到一个SomeInterfaceConfiguration中,该Configuration创建并提供基于FooProperties的服务实现。

即。

@Configuration
public class SomeInterfaceConfiguration {

    @Bean
    @Autowired
    public SomeInterface someInterface(FooProperties fooProperties){
        if("a".equals(fooProperties.getBar()){
            return SomeInterfaceImplementationA();
        } else {
            return SomeInterfaceImplementationB();
        }
    }
}

另一个选择是使用配置文件,但这与您希望的解决方案不同。即具有默认实现。

@Component
public class ImplementationA 

@Profile("b")
@Primary
@Component
public class ImplementationB
 类似资料:
  • 我感兴趣的是创建一个或多个自定义属性源加载器,并在我的应用程序中使用那些带有的属性源。 例如,我想开发一个属性源加载器,它能够加载XML文件并将其转换成一组属性,这些属性可以注入到我的< code>@Configuration注释类中。 是否有任何此类基于 XML 的属性源加载程序公开可用?如果没有,那么一旦我实现了它,我将如何将其提供给我的应用程序? 谢谢。

  • 我对xslt有这个问题。样式表中有一个名为misctable的表,它被放在一个变量miscTables中。例如在节点 id="_384PLATE"具有值A1、A2、B1。当我标记并将其与xml进行比较时,我需要保存R[@i=2]/C/@i属性的值。在这种情况下,我需要得到值2,3,26 xml xslt 非常感谢。

  • 问题内容: SQL Server2005。我有一个带有ColumnA位,ColumnB int的表 我可以添加默认值,以便如果为1则为15,如果为0则为0? 我知道我可以用扳机做到这一点,但我的老板对扳机存有偏见(他需要扳机敏感性培训)。 问题答案: 如果您的ColumnB只能为15或零,则可以使其成为基于ColumnA的计算列。这是添加新的计算列的代码:

  • 我想基于输入参数同步一个方法或一个块。 因此,我有一个API,它在post有效负载中有两个长类型的输入(比如id1和id2),可以是原始的,也可以是包装的),可以是JSON。这个API将被多个线程同时或随机地在不同时间调用。 现在如果第一个API调用有ID1=1和ID2=1,同时另一个API调用有ID1=1和ID2=1,它应该等待第一个API调用处理完毕后再执行第二个调用。如果第二个API调用具有

  • 我是XSLT新手,希望能得到一些帮助。 我目前有一个XML,它包含以下格式的多个副本: 我的任务是替换id属性的值。我需要根据代码的数字部分改变这个值。如果值大于850000,格式应该改为USA868509。如果该值小于850000,则将id值更改为仅包括数字。XML中的其余值应保持完全相同。 我目前拥有以下xslt: 我很难确定要更改的值,因为XSLT不执行变量循环。有没有办法更改XSLT以获得

  • 我可以检查对象中的值并基于此进行路由吗(就像写到不同的文件一样?)。我可以在pojo中添加注释以避免final json中的字段 我想到了将object转换为json,然后发送到Queue。然后我可以使用jsonpath进行条件路由。但是,我怎样才能从final JSON中省略一个字段呢?