spring bean中默认属性值的最佳实践

时间:2015-06-29 13:37:01

标签: 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)
    }

    //Notice: this is package local
    void setField(Something value) {
        field = value;
    }
}

我经常使用这种模式,因此我有一个默认行为和一个在测试中使用的行为。 someClass.someValue通常会像遗留代码中的静态方法一样令人讨厌,或者抛出异常或两者兼而有之。

有人认为这有点像黑客,但我没有看到任何不好的东西。

使用此模式有哪些缺点?

1 个答案:

答案 0 :(得分:0)

您使用的模式实际上是一种反模式:您将代码与传统结构,实现细节等结合在一起。

这违反了依赖注入(DI)和控制反转(IoC)的原则。

另一方面,Spring是DI和IoC的支持者。

因此,更好的模式是始终使用DI作为依赖关系,并删除@PostConstruct用于此类情况。

如果您需要调用静态工厂方法来创建Something对象,那不是问题:只需在XML配置中使用factory-method或自定义FactoryBean或JavaConfig中的标准@Bean方法。然后将Something对象注入SomeClass作为必需属性(例如,作为构造函数参数)。