Sự tiếp tục từ Dependency injection, delayed injection praxis. Tôi có lớp Chính:Tiêm động lực mùa xuân, kiểu giống như nhà máy
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();
}
}
Và đồ thị đối tượng được tạo động, tùy thuộc vào tương tác của người dùng. Tôi đã giải quyết khớp nối ứng dụng, cho phép tôi kiểm tra điều này rất đơn giản. Ngoài ra, vì danh sách được duy trì bởi vùng chứa, tính chất động của ứng dụng này (và mọi thứ khác) không liên quan, vì chúng có thể được yêu cầu bất cứ lúc nào ứng dụng cần chúng, duy trì các yếu tố của chúng.
Phần còn lại của mã này là ở đây:
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;
}
}
Có ai biết làm thế nào tôi sẽ giải quyết createList gọi phương thức() hoặc createSecondList() - mà không sử dụng các nhà xây dựng có khá nhiều lực lượng thiết kế. Tôi đã nghĩ đến một nhà máy, nhưng một nhà máy cho mỗi lớp trong một dự án có độ lớn hơn không có vẻ như là một ý tưởng hay.
Cái gì như:
<bean ... factory-method="..." depends-on="..." lazy-init="..."/>
Và trong phương pháp nhà máy nhanh chóng lớp và gọi phương thức createList(). Hoặc gọi nó như thế này, từ một số phương pháp - mà lại có vẻ xấu, buộc phương pháp có trách nhiệm khởi tạo biểu đồ đối tượng.
Những hình ảnh của sự phụ thuộc thời gian chạy mà tôi muốn giải quyết trong thời gian chạy là dưới đây:
Có một số cách khác mà tôi có thể sử dụng container để đạt được initalization lười biếng động tùy thuộc vào sự tương tác người dùng ?
Cảm ơn bạn.
Tôi không biết bạn đang hỏi gì. Ý bạn là gì bởi "_solve_ phương thức gọi createList() hoặc createSecondList()"? Nếu tôi đoán đúng về những gì bạn đang cố gắng làm (và tôi nghi ngờ nó), tôi sẽ tạo một lớp nhà máy có phương thức nhà máy (tĩnh?) Lấy đối số tương tác và tạo danh sách thích hợp, sau đó tiêm một đối tượng nhà máy của lớp đó vào đối tượng chính của bạn. –
Tôi nghĩ bạn sẽ hiểu được từ ngữ cảnh. Không phải là một nhà văn câu hỏi tuyệt vời. Vâng, một cái gì đó như thế này. Câu hỏi được in đậm. Bên cạnh nhà máy (tĩnh, tất nhiên) và sử dụng pull/initialization của các đối tượng (với khởi tạo trong lớp Main, "main" method), làm thế nào tôi có thể xây dựng đồ thị đối tượng động vì vậy tôi không phải lo lắng về kiến trúc "mã "trong ứng dụng của tôi. Tại sao bạn sẽ tiêm đối tượng nhà máy trong đối tượng chính của bạn? Bạn sẽ có rất nhiều công việc nếu tất cả các lớp học của bạn đều năng động. Vì bạn nên có một nhà máy ở mọi tầng lớp năng động. Tôi vẫn tin rằng có một giải pháp đơn giản hơn :) – pfh