【发布时间】:2016-08-27 17:08:36
【问题描述】:
上下文
使用 Spring 4.1.7 的应用程序。所有配置都在 XML 文件中(不使用注释),我宁愿保持这种方式(但如果必须,我可以改变事情的完成方式)。
问题
我创建了一个带有构建器类的新类。
现在我想将其他 bean 注入这个新类。我可能可以使用查找方法和类似的解决方案来做到这一点,然后在调用者 bean 中使用新类的构建器来创建一个实例。但是,我宁愿将这个新类的一个实例注入到它的调用者 bean 中,然后他们通过构建器创建一个。这就是我不确定如何做到这一点的地方。例如,这在我看来就像一个抽象工厂,但我不知道如何在运行时将这些参数(传递给构建器)传递给抽象工厂,然后再传递给它构建的工厂。
一些代码sn-ps让问题更清楚:
public final class Processor {
private final StatusEnum newStatus;
private final Long timeOut;
// I'd like this to be be injected by Spring through its setter (below)
private DaoBean daoInstance;
private Processor() {
this.newStatus = null;
this.timeOut = null;
}
private Processor(Builder builder) {
this.newStatus = builder.getNewStatus();
this.timeOut = builder.getTimeOut();
}
// To be called by Spring
public void setDaoInstance(DaoBean instance) {
this.daoInstance = instance;
}
public void updateDatabase() {
daoInstance.update(newStatus, timeOut);
}
// Builder class
public static final class Builder {
private StatusEnum newStatus;
private Long timeOut;
// lots of other fields
public Long getTimeOut() {
return this.timeOut;
}
public StatusEnum getNewStatus() {
return this.newStatus;
}
public Builder withTimeOut(Long timeOut) {
this.timeOut = timeOut;
return this;
}
public Builder withNewStatus(StatusEnum newStatus) {
this.newStatus = newStatus;
return this;
}
public Processor build() {
return new Processor(this);
}
}
}
我希望将“DaoBean”实例注入“处理器”类。但要做到这一点,处理器必须是一个 bean,否则我必须使用诸如查找方法之类的东西。另一方面,无论我想在哪里使用处理器,我都必须这样做:
new Processor.Builder()
.withTimeOut(1000L)
.withNewStatus(StatusEnum.UPDATED)
.build()
.updateDatabase();
除了这个,我想知道我是否可以让处理器成为 Spring 可以注入其调用者的 bean,同时保持其不变性。然后可以通过 Spring 将 DaoBean 的实例注入到处理器中。这样我就可以分离接线代码和业务逻辑。
值得一提的是,Builder 有很多超过 2 个字段,并不是所有的字段都必须设置。这就是为什么我认为抽象工厂是可行的方法(以不同的方式构建处理器实例)。
【问题讨论】:
-
对不起,我还没有明白你的实际问题是什么。你能发布一些代码吗?比如那个班?这样,我们将更好地了解您拥有什么以及您想要什么......
-
更新了问题。
标签: spring dependency-injection builder-pattern