是否可以使用Spring Boot的@ConfigurationProperties
注释具有不可变(最终)字段?下面的例子
@ConfigurationProperties(prefix = "example")
public final class MyProps {
private final String neededProperty;
public MyProps(String neededProperty) {
this.neededProperty = neededProperty;
}
public String getNeededProperty() { .. }
}
到目前为止我尝试过的方法:
@Bean
需要属性
参数new MyProps()
BeanInstantiationException
-我让它工作的唯一方法是为每个非最终字段提供getter/setter。
最后,如果你想要一个不可变的对象,你也可以“破解”设置器
@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
我必须经常解决这个问题,我使用了一种不同的方法,它允许我在类中使用最终变量。
首先,我将所有配置保存在一个地方(类),例如,称为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
属性,我的构造函数将保持不变(只有一个参数)-这可能会减少其他地方的更改数量等。
我希望这会有帮助
从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 是如何使用浅比较来决定组件是否需要重新渲染的? - 为什