Spring Bean中默认属性值的最佳做法

问题描述 投票:0回答:1

为了使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通常会很讨厌,例如来自遗留代码的静态方法,或者会引发异常或两者兼而有之。

有人认为这有点骇人听闻,但我认为其中没有任何坏处。

使用此模式有什么缺点?

java spring tdd spring-test
1个回答
0
投票

实际上,您所使用的模式是一种反模式:您将代码耦合到旧结构,实现细节等。

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

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

因此,更好的模式是始终对依赖项使用DI并在这种情况下删除@PostConstruct

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

© www.soinside.com 2019 - 2024. All rights reserved.