【问题标题】:Best practice for default property values in spring beansspring bean 中默认属性值的最佳实践
【发布时间】:2015-06-29 13:37:01
【问题描述】:

为了使 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 通常会是一些讨厌的东西,比如遗留代码中的静态方法,或者抛出异常的东西,或者两者兼而有之。

有人认为这有点像 hack,但我看不出有什么不好的地方。

使用这种模式有什么缺点?

【问题讨论】:

    标签: java spring tdd spring-test


    【解决方案1】:

    您使用的模式实际上是一种反模式:您将代码与遗留结构、实现细节等耦合。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-20
      • 1970-01-01
      • 2020-05-05
      • 2012-02-21
      • 2016-08-08
      • 1970-01-01
      • 1970-01-01
      • 2015-10-09
      相关资源
      最近更新 更多