Продолжение с Dependency injection, delayed injection praxis. У меня есть Основной класс:Весна динамическая инъекция, заводская модель
package test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Scanner;
@Component
public class Main {
@Autowired
private StringValidator stringValidator;
@Autowired
private StringService stringService;
@Autowired
private ValidationService validationService;
public void main() {
scanKeyboardCreateLists();
stringValidator.validate();
final List<String> validatedList = stringValidator.getValidatedList();
for (String currentValid : validatedList) {
System.out.println(currentValid);
}
}
private void scanKeyboardCreateLists() {
//Let's presume the user interacts with the GUI, dynamically changing the object graph...
//Needless to say, this is past container initialization...
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
//Delayed creation, dynamic
if (choice == 0) {
stringService.createList();
validationService.createList();
} else {
stringService.createSecondList();
validationService.createSecondList();
}
}
public static void main(String[] args) {
ApplicationContext container = new ClassPathXmlApplicationContext("/META-INF/spring/applicationContext.xml");
container.getBean(Main.class).main();
}
}
И графический объект динамически создается в зависимости от взаимодействия пользователя. Я решил использовать приложение, позволяющее мне это проверить очень просто. Кроме того, поскольку списки поддерживаются контейнером, динамический характер этого приложения (и любого другого) не имеет значения, поскольку их можно запросить в любое время, когда приложение им понадобится, поддерживая их элементы.
Остальная часть коды находится здесь:
package test;
import java.util.List;
public interface Stringable {
List<String> getStringList();
}
package test;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
@Component
public class StringList extends ArrayList<String> {
}
package test;
import org.springframework.stereotype.Component;
import javax.inject.Inject;
import java.util.ArrayList;
import java.util.List;
@Component
public class StringService implements Stringable {
private List<String> stringList;
@Inject
public StringService(final ArrayList<String> stringList) {
this.stringList = stringList;
}
//Simplified
public void createList() {
stringList.add("FILE1.txt");
stringList.add("FILE1.dat");
stringList.add("FILE1.pdf");
stringList.add("FILE1.rdf");
}
public void createSecondList() {
stringList.add("FILE2.txt");
stringList.add("FILE2.dat");
stringList.add("FILE3.pdf");
stringList.add("FILE3.rdf");
}
@Override
public List<String> getStringList() {
return stringList;
}
}
package test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component
public class StringValidator {
private List<String> stringList;
private List<String> validationList;
private final List<String> validatedList = new ArrayList<String>();
@Autowired
public StringValidator(final ArrayList<String> stringList,
final ArrayList<String> validationList) {
this.stringList = stringList;
this.validationList = validationList;
}
public void validate() {
for (String currentString : stringList) {
for (String currentValidation : validationList) {
if (currentString.equalsIgnoreCase(currentValidation)) {
validatedList.add(currentString);
}
}
}
}
public List<String> getValidatedList() {
return validatedList;
}
}
package test;
import java.util.List;
public interface Validateable {
List<String> getValidationList();
}
package test;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
@Component
public class ValidationList extends ArrayList<String> {
}
package test;
import org.springframework.stereotype.Component;
import javax.inject.Inject;
import java.util.ArrayList;
import java.util.List;
@Component
public class ValidationService implements Validateable {
private List<String> validationList;
@Inject
public ValidationService(final ArrayList<String> validationList) {
this.validationList = validationList;
}
//Simplified...
public void createList() {
validationList.add("FILE1.txt");
validationList.add("FILE2.txt");
validationList.add("FILE3.txt");
validationList.add("FILE4.txt");
}
public void createSecondList() {
validationList.add("FILE5.txt");
validationList.add("FILE6.txt");
validationList.add("FILE7.txt");
validationList.add("FILE8.txt");
}
@Override
public List<String> getValidationList() {
return validationList;
}
}
Кто-нибудь знает, как бы я решить createList метода вызова() или createSecondList() - без использования конструктора, который в значительной степени силы дизайна. Я думал о фабрике, но фабрика для каждого класса в проекте большего масштаба не кажется хорошей идеей.
Что-то вроде:
<bean ... factory-method="..." depends-on="..." lazy-init="..."/>
И в фабричный метод экземпляра класса и вызвать метод createList(). Или вызовите его так, используя некоторый метод - который снова выглядит плохо, заставляя метод нести ответственность за создание экземпляра графа объекта.
Картина зависимостей времени выполнения, которые я хочу решить в режиме исполнения ниже:
Есть ли какой-то другой способ, которым я мог бы использовать контейнер для того чтобы достигнуть динамического ленивым инициализационного в зависимости от взаимодействия с пользователем ?
спасибо.
Я понятия не имею, что вы просите. Что вы подразумеваете под «_solve_ метод вызова createList() или createSecondList()»? Если я правильно понимаю, что вы пытаетесь сделать (и я сомневаюсь), я бы создал фабричный класс, который имеет (статический?) Заводский метод, который принимает интерактивный аргумент и создает соответствующий список, затем вводит фабричный объект этого класса в ваш Основной объект. –
Я думал, вы поймете из контекста. Не большой писатель. Да, что-то вроде этого. Вопрос выделен жирным шрифтом. Помимо заводского (статического, конечно) и с использованием pull/initialization объектов (с инициализацией в основном классе, «основным» методом), как я могу построить график динамических объектов, поэтому мне не нужно беспокоиться о «коде» архитектуры "в моем заявлении. Зачем вам вводить фабричный объект в свой основной объект? У вас будет много работы, если все ваши классы будут динамическими. Поскольку у вас должен быть завод на каждом динамическом классе. Я все еще верю, что есть более простое решение :) – pfh