0

我喜欢使用构造函数添加依赖项的能力。特别是自动装配这些依赖项。

例如

public class MyClass {
    private final Dependency dependency;

    @Autowired
    public MyClass(@Qualifier("bean-id") Dependency dependency) {
        this.dependency = dependency;
    }

}

我发现如果上面的“依赖”类恰好是一个传递给工作流工作者的类并且缺少默认的空构造函数,那么 Spring Cloud AWS 框架会抛出一个“InstantiationException”。

具体例子:

public class MyClass {
    private final DependencyWorkflowClientExternalFactory clientFactory;

    @Autowired
    public MyClass(@Qualifier("bean-id") DependencyWorkflowClientExternalFactory clientFactory) {
        this.clientFactory = clientFactory;
    }
}

public class WorkflowInitializer {

    @Autowired
    private WorkflowWorker workflowWorker; //assume wired with correct credentials    

    public WorkflowInitialiser() {
         init();
    }

    public init() {
        workflowWorker.addWorkflowImplementationType(MyClass.class);
    }
}

以上失败:

java.lang.InstantiationException: com.mypackage.MyClass
at java.lang.Class.newInstance(Class.java:359)

我必须做类似的事情:

public class MyClass {
    @Autowired
    @Qualifier("bean-id")
    private Dependency dependency; 

    public MyClass() {
    }
}

问题是:

在 Spring Cloud 框架的当前版本中是否可以在构造函数上使用 @Autowire 注释?是否需要将注释添加到实例字段?

我问(并假设“是”),因为工作流工作者采用类类型,而不是为他们的工作流实现而实例化对象。

作为次要问题:

为什么 ActivityWorkers 采用对象的实例,而 WorkflowWorkers 采用类?

4

1 回答 1

1

这个问题实际上与 Spring Cloud AWS 无关,而是与 AWS Flow Framework for Java 有关。

您正在使用“默认” WorkflowWorker,它将工作流实现实例化为 POJO。因此,您的 MyClass 类不是作为 Spring bean 创建的,而是作为 POJO 创建的。

您应该使用 AWS Flow Framework 提供的 SpringWorkflowWorker 以更好地与 Spring 集成。有关更多信息,请查看解释与 Spring 集成的AWS Flow Framework 文档。

于 2015-01-08T08:50:56.697 回答