spring bean 中默认 属性 值的最佳实践
Best practice for default property values in spring beans
为了使 bean 可测试,我通常使用以下模式:
class SomeClass {
private Something field = null;
@PostConstruct
public void init() {
if (field == null)
field = someClass.someValue; //(this may throw an exception, that's why it's here)
}
//Notice: this is package local
void setField(Something value) {
field = value;
}
}
我经常使用这种模式,所以我有一个默认行为和一个要在测试中使用的行为。 someClass.someValue 通常是一些令人讨厌的东西,比如来自遗留代码的静态方法,或者抛出异常的东西,或者两者兼而有之。
有人认为这有点乱七八糟,但我看不出有什么不好。
使用这种模式有什么缺点?
您使用的模式实际上是一种反模式:您将代码与遗留结构、实现细节等耦合。
这违反了依赖注入 (DI) 和控制反转 (IoC) 的原则。
Spring,另一方面,是DI和IoC的支持者。
因此,更好的模式是始终对您的依赖项使用 DI,并在这种情况下删除 @PostConstruct
的使用。
如果您需要调用静态工厂方法来创建您的 Something
对象,这不是问题:只需在 XML 中使用 factory-method
或自定义 FactoryBean
配置或 JavaConfig 中的标准 @Bean
方法。然后将 Something
对象作为必需的 属性 注入到 SomeClass
中(例如,作为构造函数参数)。
为了使 bean 可测试,我通常使用以下模式:
class SomeClass {
private Something field = null;
@PostConstruct
public void init() {
if (field == null)
field = someClass.someValue; //(this may throw an exception, that's why it's here)
}
//Notice: this is package local
void setField(Something value) {
field = value;
}
}
我经常使用这种模式,所以我有一个默认行为和一个要在测试中使用的行为。 someClass.someValue 通常是一些令人讨厌的东西,比如来自遗留代码的静态方法,或者抛出异常的东西,或者两者兼而有之。
有人认为这有点乱七八糟,但我看不出有什么不好。
使用这种模式有什么缺点?
您使用的模式实际上是一种反模式:您将代码与遗留结构、实现细节等耦合。
这违反了依赖注入 (DI) 和控制反转 (IoC) 的原则。
Spring,另一方面,是DI和IoC的支持者。
因此,更好的模式是始终对您的依赖项使用 DI,并在这种情况下删除 @PostConstruct
的使用。
如果您需要调用静态工厂方法来创建您的 Something
对象,这不是问题:只需在 XML 中使用 factory-method
或自定义 FactoryBean
配置或 JavaConfig 中的标准 @Bean
方法。然后将 Something
对象作为必需的 属性 注入到 SomeClass
中(例如,作为构造函数参数)。