不可变的@ConfigurationProperties

编程入门 行业动态 更新时间:2024-10-23 22:37:04
本文介绍了不可变的@ConfigurationProperties的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

是否可以使用Spring Boot的 @ConfigurationProperties 注释获得不可变(最终)字段?以下示例

Is it possible to have immutable (final) fields with Spring Boot's @ConfigurationProperties annotation? Example below

@ConfigurationProperties(prefix = "example") public final class MyProps { private final String neededProperty; public MyProps(String neededProperty) { this.neededProperty = neededProperty; } public String getNeededProperty() { .. } }

到目前为止我尝试过的方法:

Approaches I've tried so far:

  • 创建 @Bean
    • 提供两个构造函数:empty和 neededProperty 参数
    • 使用创建新的MyProps()
    • 字段中的结果 null
    • Creating a @Bean of the MyProps class with two constructors
      • Providing two constructors: empty and with neededProperty argument
      • The bean is created with new MyProps()
      • Results in the field being null
        • 结果 BeanInstantiationException - > NoSuchMethodException:MyProps。< init>()
        • Results in BeanInstantiationException -> NoSuchMethodException: MyProps.<init>()

        我工作的唯一方法是为每个非最终字段提供getter / setter。

        The only way I have got it working is by providing getter/setter for each non-final field.

        推荐答案

        我必须经常解决这个问题而且我使用的有点不同方法,允许我在类中使用 final 变量。

        I have to resolve that problem very often and I use a bit different approach, which allows me to use final variables in a class.

        首先,我保留所有配置在一个地方(类),比如称为 ApplicationProperties 。该类具有 @ConfigurationProperties 具有特定前缀的注释。它也列在 @EnableConfigurationProperties 注释中,用于配置类(或主类)。

        First of all, I keep all my configuration in a single place (class), say, called ApplicationProperties. That class has @ConfigurationProperties annotation with a specific prefix. It is also listed in @EnableConfigurationProperties annotation against configuration class (or main class).

        然后我提供我的 ApplicationProperties 作为构造函数参数,并对构造函数中的 final 字段执行赋值。

        Then I provide my ApplicationProperties as a constructor argument and perform assignment to a final field inside a constructor.

        示例:

        主要类:

        @SpringBootApplication @EnableConfigurationProperties(ApplicationProperties.class) public class Application { public static void main(String... args) throws Exception { SpringApplication.run(Application.class, args); } }

        ApplicationProperties class

        ApplicationProperties class

        @ConfigurationProperties(prefix = "myapp") public class ApplicationProperties { private String someProperty; // ... other properties and getters public String getSomeProperty() { return someProperty; } }

        以及具有最终属性的类

        @Service public class SomeImplementation implements SomeInterface { private final String someProperty; @Autowired public SomeImplementation(ApplicationProperties properties) { this.someProperty = properties.getSomeProperty(); } // ... other methods / properties }

        我更喜欢这种方法,原因很多,例如如果我必须在构造函数中设置更多属性,我的构造函数参数列表不是巨大,因为我总是有一个参数(在我的情况下 ApplicationProperties );如果需要添加更多 final 属性,我的构造函数保持不变(只有一个参数) - 这可能会减少其他地方的更改次数等。

        I prefer this approach for many different reasons e.g. if I have to setup more properties in a constructor, my list of constructor arguments is not "huge" as I always have one argument (ApplicationProperties in my case); if there is a need to add more final properties, my constructor stays the same (only one argument) - that may reduce number of changes elsewhere etc.

        我希望这会有所帮助

  • 更多推荐

    不可变的@ConfigurationProperties

    本文发布于:2023-10-19 14:50:32,感谢您对本站的认可!
    本文链接:https://www.elefans.com/category/jswz/34/1507846.html
    版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
    本文标签:ConfigurationProperties

    发布评论

    评论列表 (有 0 条评论)
    草根站长

    >www.elefans.com

    编程频道|电子爱好者 - 技术资讯及电子产品介绍!