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 फोन()। या इसे इस तरह से कॉल करें, कुछ विधि से - जो फिर से खराब दिखता है, ऑब्जेक्ट ग्राफ़ को तुरंत चालू करने की ज़िम्मेदारी रखने के लिए विधि को मजबूर करता है।
क्रम निर्भरता है कि मैं क्रम में हल करना चाहते हैं की तस्वीर bellow है:
वहाँ किसी और तरीके से मैं कंटेनर इस्तेमाल कर सकते हैं उपयोगकर्ता बातचीत के आधार पर गतिशील आलसी initalization हासिल करने के लिए है ?
धन्यवाद।
मुझे नहीं पता कि आप क्या पूछ रहे हैं। "_solve_ विधि कॉल createList() या createSecondList()" से आपका क्या मतलब है? यदि मैं अपने अनुमान में सही हूं कि आप क्या करने की कोशिश कर रहे हैं (और मुझे शक है), तो मैं एक फैक्ट्री क्लास तैयार करूंगा जिसमें एक (स्थैतिक?) फैक्ट्री विधि होगी जो इंटरैक्टिव तर्क लेती है और उपयुक्त सूची बनाती है, फिर इंजेक्ट करें उस मुख्य श्रेणी में उस वर्ग का कारखाना वस्तु। –
मैंने सोचा कि आप संदर्भ से समझेंगे। एक महान सवाल लेखक नहीं है। हाँ, ऐसा कुछ। सवाल बोल्ड किया गया है। कारखाने के अलावा (स्थिर, निश्चित रूप से) और वस्तुओं के पुल/प्रारंभिकरण (मुख्य वर्ग में प्रारंभिकता के साथ, "मुख्य" विधि) का उपयोग करके, मैं गतिशील ऑब्जेक्ट ग्राफ़ कैसे बना सकता हूं इसलिए मुझे आर्किटेक्चर के बारे में चिंता करने की ज़रूरत नहीं है "कोड "मेरे आवेदन में। आप अपने मुख्य वस्तु में फैक्ट्री ऑब्जेक्ट को इंजेक्ट क्यों करेंगे? यदि आपके सभी वर्ग गतिशील हैं तो आपके पास बहुत काम होगा। चूंकि आपके पास प्रत्येक गतिशील वर्ग पर एक कारखाना होना चाहिए। मुझे अभी भी विश्वास है कि एक आसान समाधान है :) – pfh