Java Language
ServiceLoader
खोज…
टिप्पणियों
ServiceLoader
उपयोग उन वर्गों के उदाहरणों को प्राप्त करने के लिए किया जा सकता है, जो किसी .jar
फ़ाइल में पैक की गई फ़ाइल में निर्दिष्ट हैं (= सेवा)। विस्तारित / कार्यान्वित की जाने वाली सेवा अक्सर एक इंटरफ़ेस होती है, लेकिन इसकी आवश्यकता नहीं होती है।
प्रचलित / लागू करने वाली कक्षाओं को ServiceLoader
लिए एक शून्य तर्क निर्माणकर्ता प्रदान करने की आवश्यकता है ताकि उन्हें तत्काल किया जा सके।
ServiceLoader
द्वारा खोजी जाने वाली फ़ाइल को पूरी तरह से योग्य प्रकार के नाम के साथ कार्यान्वित सेवा के नाम के साथ जार फ़ाइल में META-INF/services
निर्देशिका के अंदर संग्रहीत करने की आवश्यकता है। इस फ़ाइल में प्रति पंक्ति सेवा को लागू करने वाले वर्ग का एक पूरी तरह से योग्य नाम है।
लकड़हारा सेवा
निम्न उदाहरण दिखाता है कि ServiceLoader
माध्यम से लॉगिंग के लिए एक वर्ग को कैसे तत्काल किया जाए।
सेवा
package servicetest;
import java.io.IOException;
public interface Logger extends AutoCloseable {
void log(String message) throws IOException;
}
सेवा का कार्यान्वयन
निम्नलिखित कार्यान्वयन केवल System.err
को संदेश लिखते हैं
package servicetest.logger;
import servicetest.Logger;
public class ConsoleLogger implements Logger {
@Override
public void log(String message) {
System.err.println(message);
}
@Override
public void close() {
}
}
निम्नलिखित कार्यान्वयन पाठ फ़ाइल में संदेश लिखते हैं:
package servicetest.logger;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import servicetest.Logger;
public class FileLogger implements Logger {
private final BufferedWriter writer;
public FileLogger() throws IOException {
writer = new BufferedWriter(new FileWriter("log.txt"));
}
@Override
public void log(String message) throws IOException {
writer.append(message);
writer.newLine();
}
@Override
public void close() throws IOException {
writer.close();
}
}
META-INF / सेवाओं / servicetest.Logger
META-INF/services/servicetest.Logger
फ़ाइल Logger
कार्यान्वयन के नामों को सूचीबद्ध करती है।
servicetest.logger.ConsoleLogger
servicetest.logger.FileLogger
प्रयोग
निम्न main
विधि सभी उपलब्ध लॉगर के लिए एक संदेश लिखती है। Loggers ServiceLoader
का उपयोग कर त्वरित कर रहे हैं।
public static void main(String[] args) throws Exception {
final String message = "Hello World!";
// get ServiceLoader for Logger
ServiceLoader<Logger> loader = ServiceLoader.load(servicetest.Logger.class);
// iterate through instances of available loggers, writing the message to each one
Iterator<Logger> iterator = loader.iterator();
while (iterator.hasNext()) {
try (Logger logger = iterator.next()) {
logger.log(message);
}
}
}
सरल ServiceLoader उदाहरण
ServiceLoader इंटरफ़ेस कार्यान्वयन के गतिशील लोडिंग के लिए अंतर्निहित तंत्र का उपयोग करने के लिए एक सरल और आसान है। सेवा लोडर के साथ - तात्कालिकता के लिए साधन प्रदान करना (लेकिन वायरिंग नहीं) - जावा एसई में एक साधारण निर्भरता इंजेक्शन तंत्र बनाया जा सकता है। ServiceLoader इंटरफ़ेस और कार्यान्वयन पृथक्करण स्वाभाविक हो जाता है और कार्यक्रमों को आसानी से बढ़ाया जा सकता है। वास्तव में बहुत से जावा एपीआई सेवाओलाडर पर आधारित हैं
मूल अवधारणाएं हैं
- सेवाओं के इंटरफेस पर काम करना
-
ServiceLoader
माध्यम सेServiceLoader
कार्यान्वयन (ओं) को प्राप्त करना - सर्विसिक्स का कार्यान्वयन प्रदान करना
आइए इंटरफ़ेस से शुरू करते हैं और इसे जार में डालते हैं, जिसका नाम accounting-api.jar
package example;
public interface AccountingService {
long getBalance();
}
अब हम उस सेवा के कार्यान्वयन को एक accounting-impl.jar
नाम accounting-impl.jar
जार में सेवा प्रदान करते हैं, जिसमें सेवा का कार्यान्वयन शामिल है
package example.impl;
import example.AccountingService;
public interface DefaultAccountingService implements AccouningService {
public long getBalance() {
return balanceFromDB();
}
private long balanceFromDB(){
...
}
}
इसके अलावा, accounting-impl.jar
में यह घोषणा करने वाली फ़ाइल शामिल है कि यह जार AccountingService
सेवा का कार्यान्वयन प्रदान करता है। फ़ाइल में META-INF/services/
शुरू होने वाला एक पथ होना चाहिए META-INF/services/
और इंटरफ़ेस के पूर्ण-योग्य नाम के समान नाम होना चाहिए:
-
META-INF/services/example.AccountingService
फ़ाइल की सामग्री कार्यान्वयन का पूरी तरह से योग्य नाम है:
example.impl.DefaultAccountingService
दोनों जार को देखते हुए कार्यक्रम के classpath, कि खपत में हैं AccountingService
, सेवा का एक उदाहरण ServiceLauncher का उपयोग करके प्राप्त किया जा सकता है
ServiceLoader<AccountingService> loader = ServiceLoader.load(AccountingService.class)
AccountingService service = loader.next();
long balance = service.getBalance();
जैसा कि ServiceLoader
एक Iterable
, यह कई कार्यान्वयन प्रदाताओं का समर्थन करता है, जहां कार्यक्रम से चुन सकते हैं:
ServiceLoader<AccountingService> loader = ServiceLoader.load(AccountingService.class)
for(AccountingService service : loader) {
//...
}
ध्यान दें कि जब next()
एक नया उदाहरण आबंटित किया जाएगा। आप एक उदाहरण फिर से उपयोग करना चाहते हैं, तो आप का उपयोग करने के iterator()
के रूप में ऊपर दिखाए गए ServiceLoader की विधि या के लिए-प्रत्येक पाश।