我喜欢使用构造函数添加依赖项的能力。特别是自动装配这些依赖项。
e.g。
public class MyClass {
private final Dependency dependency;
@Autowired
public MyClass(@Qualifier("bean-id") Dependency dependency) {
this.dependency = dependency;
}
}
我发现Spring Cloud AWS框架引发了一个" InstantiationException"如果"依赖"上面的类碰巧是一个传递给Workflow worker的类,并且缺少一个默认的空构造函数。
具体例子:
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注释?是否要求将注释添加到实例字段?
我问(并假设"是")因为Workflow工作者采用类类型,而不是实例化工作流的对象实例。
作为第二个问题:
为什么ActivityWorkers会获取对象的实例,但WorkflowWorkers会接受类?
答案 0 :(得分:1)
此问题实际上与Spring Cloud AWS无关,而与AWS Flow Framework for Java无关。
您正在使用"默认" WorkflowWorker将工作流实现实例化为POJO。因此,您的类MyClass不是作为Spring bean创建的,而是作为POJO创建的。
您应该使用AWS Flow Framework提供的SpringWorkflowWorker来更好地与Spring集成。有关更多信息,请查看解释与Spring集成的AWS Flow Framework documentation。