Java Springbeans中默认属性值的最佳实践

Java Springbeans中默认属性值的最佳实践,java,spring,tdd,spring-test,Java,Spring,Tdd,Spring Test,为了使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) }

为了使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方法
或自定义
FactoryBean
,或者在JavaConfig中使用标准的
@Bean
方法。然后将
Something
对象作为必需属性(例如,作为构造函数参数)注入
SomeClass