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

不可变@ConfigurationProperties

孟俊晖
2023-03-14

是否可以使用Spring Boot的@ConfigurationProperties注释具有不可变(最终)字段?下面的例子

@ConfigurationProperties(prefix = "example")
public final class MyProps {

  private final String neededProperty;

  public MyProps(String neededProperty) {
    this.neededProperty = neededProperty;
  }

  public String getNeededProperty() { .. }
}

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

  • 使用两个构造函数创建MyProps类的@Bean
    • 提供两个构造函数:空和需要属性参数
    • bean是用new MyProps()
    • 创建的
    • 结果字段为null
    • 导致BeanInstantiationException-

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

共有3个答案

雷晋
2023-03-14

最后,如果你想要一个不可变的对象,你也可以“破解”设置器

@ConfigurationProperties(prefix = "myapp")
public class ApplicationProperties {
    private String someProperty;

    // ... other properties and getters

    public String getSomeProperty() {
       return someProperty;
    }

    public String setSomeProperty(String someProperty) {
      if (someProperty == null) {
        this.someProperty = someProperty;
      }       
    }
}

显然,如果属性不仅仅是一个字符串,也就是一个可变对象,事情就更复杂了,但这是另一回事。

更好的是,您可以创建一个配置容器

@ConfigurationProperties(prefix = "myapp")
public class ApplicationProperties {
   private final List<MyConfiguration> configurations  = new ArrayList<>();

   public List<MyConfiguration> getConfigurations() {
      return configurations
   }
}

其中,现在的配置是一个没有

public class MyConfiguration {
    private String someProperty;

    // ... other properties and getters

    public String getSomeProperty() {
       return someProperty;
    }

    public String setSomeProperty(String someProperty) {
      if (this.someProperty == null) {
        this.someProperty = someProperty;
      }       
    }
}

和应用。yml as

myapp:
  configurations:
    - someProperty: one
    - someProperty: two
    - someProperty: other
宗乐池
2023-03-14

我必须经常解决这个问题,我使用了一种不同的方法,它允许我在类中使用最终变量。

首先,我将所有配置保存在一个地方(类),例如,称为Application ationProperties。该类具有具有特定前缀的@ConfigurationProperties注释。它还列在针对配置类(或主类)的@EnableConfigurationProperties注释中。

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

示例:

主要类别:

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

应用程序属性

@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属性,我的构造函数将保持不变(只有一个参数)-这可能会减少其他地方的更改数量等。

我希望这会有帮助

邹杰
2023-03-14

从SpringBoot2.2开始,最终可以定义一个用@ConfigurationProperties修饰的不可变类
文档显示了一个示例
您只需使用要绑定的字段(而不是setter方式)声明一个构造函数,并在类级别添加@ConstructorBinding注释,以指示应使用构造函数绑定
因此,没有任何setter的实际代码现在就可以了:

@ConstructorBinding
@ConfigurationProperties(prefix = "example")
public final class MyProps {

  private final String neededProperty;

  public MyProps(String neededProperty) {
    this.neededProperty = neededProperty;
  }

  public String getNeededProperty() { .. }
}
 类似资料:
  • 本文向大家介绍python不可变变量?相关面试题,主要包含被问及python不可变变量?时的应答技巧和注意事项,需要的朋友参考一下 不可变对象是指不可以被引用改变的对象,如字符串 #

  • 我们经常使用可变的变量,但可能有很多情况下不需要可变性。 在这种情况下可以使用不可变的变量。 下面给出了一些可以使用不可变变量的例子。 在数学常量如pi情况下永远不会改变。 对于我们想要保留值的数组而言,它不是变异的要求。 不变性使得可以理解变量是不可变的还是可变的,从而保证某些操作不会改变某些变量。 它还降低了某些类型的程序错误的风险。 D的不变性概念由const和immutable关键字表示。

  • 问题内容: 我正在努力使可变对象与不可变对象有关。使用可变对象会带来很多负面影响(例如,从方法中返回字符串数组),但是我很难理解它的负面影响。使用可变对象的最佳实践是什么?您是否应尽可能避免使用它们? 问题答案: 好吧,这有几个方面。 没有参考身份的可变对象会在奇数时间导致错误。例如,考虑使用基于值的方法的 : 当实例用作键时,实例在映射中“丢失”,因为实例和相等性基于可变值。这些值在映射之外更改

  • 问题内容: 我指的是Apple的Swift编程指南,以了解如何用Swift语言创建可变/不可变对象(数组,字典,集合,数据)。但是我不明白如何在Swift中创建一个不可变的集合。 我希望在Objective-C中看到以下Swift中的等效项 不变数组 可变数组 不变字典 可变字典 问题答案: 创建不可变数组 第一种方式: 第二种方式: 创建可变数组 将对象追加到数组 辞典 创建不可变字典 创建可变

  • 问题内容: 我找到了一篇有趣的代码文章: 我真的很好奇了解创建此类的优势。我知道这里的此类对象是不可变的,因为一旦初始化就无法更改其变量值。我以前从未做过这样的事情,而且我真的不了解它的优势。 为什么是个好习惯? 您能说出可以使用这种方法的情况吗? 常量或只读变量呢?那不是很相似吗? 在文章中说,这不利于应用程序的性能。 但是为什么 呢? 问题答案: 您提到的示例是不可变对象。它在编程语言中被广泛

  • 目录 不变性(immutability)的好处有哪些? 为什么 Redux 需要不变性? 为什么 Redux 对浅比较的使用要求不变性? - 浅比较和深比较有何区别? - Redux 是如何使用浅比较的? - combineReducers 是如何进行浅比较的? - React-Redux 是如何使用浅比较拗的? - React-Redux 是如何使用浅比较来决定组件是否需要重新渲染的? - 为什