具有服务注入的spring chaining构造函数

时间:2015-06-03 04:46:40

标签: java spring design-patterns

我有一个班级,像这样

public class testClass {
    private TestService testService;

    public testClass() {
        this(testService);
    }

    @Autowired(required = true)
    public testClass(TestService testService) {
        this.testService = testService;
    }
}

默认的无参数构造函数是必需的,因为我有一个结构化的工厂设计,从那里我调用我的无参数构造函数,所以我不想改变这个结构。所以我选择chaining constructorargumented constructor致电default constructor。但java正在抛出异常

cannot reference testService before supertype constructor has been called

我可以将testService设为static来解决此异常,但是从here开始,我认为静态注入并不总是一个好主意。

有人可以建议我使用一些设计解决方案来解决如何在没有静态注入的情况下从argumented constructor解决或调用此default constructor

1 个答案:

答案 0 :(得分:2)

您有两种选择:

现场注入

在字段中添加@Autowired注释,并使用参数丢弃构造函数。

Spring将使用反射注入依赖项。如果在你的例子中,那之后的默认构造函数是空的,并且你也可以把它扔掉,因为java编译器会为你创建它。

Pro:短代码

构造函数注入 扔掉无参数构造函数。 Spring会提供依赖很好。

Pro:你的代码在没有Spring的情况下运行良好,这是很好的,其中包括测试。 Here is a more detailed explanation why I prefer this variation

另外一些评论:

  • 始终使用首字母大写命名类。其他一切都让你的代码真的很难为Java开发人员阅读。

  • 你根本没有工厂。如果您有兴趣,可以通过各种方式将Factories与Spring结合使用。