खोज…


टिप्पणियों

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 की विधि या के लिए-प्रत्येक पाश।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow