КонтекстВесна - Инъекция бобов с использованием Builder шаблон
Приложение, которое использует Spring 4.1.7. Все конфигурации хранятся в файлах XML (не используя аннотации), и я предпочитаю сохранять их таким образом (но я могу изменить способы, как это делается, если я должен).
Проблема
Я создал новый класс, который поставляется с классом строителя.
Теперь я хотел бы добавить другие компоненты в этот новый класс. Я могу, вероятно, использовать методы поиска и аналогичные решения для этого, а затем использовать конструктор нового класса в компонентах вызывающего объекта для создания экземпляра. Тем не менее, я скорее экземпляр этого нового класса, который должен быть добавлен к его компонентам-вызывающим, затем они создают один через строителя. Вот где я не уверен, как я могу это сделать. Например, для меня это выглядит как абстрактная фабрика, но я не знаю, как передать эти параметры (которые передаются разработчику) во время выполнения на абстрактную фабрику, а затем заводы, которые она создает.
Некоторые фрагменты кода, чтобы сделать вопрос яснее:
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», который будет введен в класс «Processor». Но для этого процессор должен быть bean или иначе я должен использовать что-то вроде lookup-методов. С другой стороны, там, где я хочу использовать процессор, я должен сделать что-то вроде этого:
new Processor.Builder()
.withTimeOut(1000L)
.withNewStatus(StatusEnum.UPDATED)
.build()
.updateDatabase();
Вместо этого, я задаюсь вопросом, могу ли я сделать процессор боба, что весна может придать своим абонентам при сохранении его неизменность. Затем экземпляр DaoBean может быть введен в процессор по весне. Таким образом, я смогу выделить код проводки и бизнес-логику.
Следует отметить, что Builder имеет намного больше, чем 2 поля, и не все они должны быть установлены. Вот почему я думал, что абстрактная фабрика - это путь (создание экземпляров Процессора по-разному).
Извините, я еще не понял, какова ваша фактическая проблема. Не могли бы вы разместить какой-нибудь код? Например, этот класс? Таким образом, мы лучше поймем, что у вас есть и что вы хотите ... –
Обновлен вопрос. –