Migration Deep Dive für 29 · Service Registry und ServiceLoader öffnen →
⌂ ÜbersichtAlle Vergleiche
Modul 29 · 100 % Codeabdeckung

Service Registry und ServiceLoader

Vollständiger Legacy-Modern-Vergleich aller Java-Klassen, Tests, Maven-POMs und relevanten Ressourcen dieses Moduls. Jede Datei ist genau einmal einer fachlich passenden Vergleichsgruppe zugeordnet.

4Legacy-Dateien
5Modern-Dateien
74 → 68Codezeilen
10/10vollständig erfasst

Fachliche Einordnung

Legacy

Eigene dynamische Service Registry

Services werden zur Laufzeit explizit registriert, ersetzt und entfernt.

Modern

Java SPI mit ServiceLoader

Provider werden über META-INF/services beziehungsweise Modulmetadaten entdeckt.

Vergleichsfokus: Alle Dateien werden nach technischer Rolle und fachlicher Verantwortung gruppiert.
Wichtige Abgrenzung: One-to-many-Änderungen werden als Gruppe dargestellt; eine künstliche 1:1-Zuordnung wird vermieden.

Vollständige Abdeckungsmatrix

Die Ähnlichkeit ist eine technische Orientierung auf normalisiertem Quelltext. Sie ersetzt keine fachliche Bewertung.

VergleichsgruppeLegacy-DateienModern-DateienLegacy-ZeilenModern-ZeilenÄhnlichkeit
Build-Konfiguration11343497%
Service-Vertrag und Default-Provider1251443%
Registry/Provider-Auflösung und Test22352025%

Gemeinsame Modulstruktur

Das Pair-POM bindet die Legacy- und Modern-Submodule zusammen und gehört deshalb ebenfalls zur vollständigen Codeabdeckung.

Gemeinsam · 19 Zeilenpom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>at.aydin.academy</groupId>
        <artifactId>java-modernization-deep-dive</artifactId>
        <version>1.0.0</version>
        <relativePath>../../pom.xml</relativePath>
    </parent>
    <artifactId>29osgiserviceregistry-pair</artifactId>
    <packaging>pom</packaging>
    <name>Service Registry und Java ServiceLoader: Legacy und Modern</name>
    <modules>
        <module>legacy</module>
        <module>modern</module>
    </modules>
</project>

Alle semantischen Codevergleiche

01Build-KonfigurationDirektvergleich · Legacy 34 / Modern 34 Zeilen · Ähnlichkeit 97%

Registry-/ServiceLoader-Konfiguration wird verglichen.

Legacy-DateienModern-DateienEinordnung
pom.xmlpom.xmlDirektvergleich
Semantische Ähnlichkeit: 97%

Legacy

Legacy · 34 Zeilenlegacy/pom.xml
<?xml version="1.0" encoding="UTF-8"?>
        <project xmlns="http://maven.apache.org/POM/4.0.0"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
            <modelVersion>4.0.0</modelVersion>
            <parent>
                <groupId>at.aydin.academy</groupId>
                <artifactId>29osgiserviceregistry-pair</artifactId>
                <version>1.0.0</version>
                <relativePath>../pom.xml</relativePath>
            </parent>
            <artifactId>osgi-registry-legacy</artifactId>
            <packaging>jar</packaging>
            <name>OSGi Registry Legacy</name>

            <dependencies>

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <scope>test</scope>
</dependency>

            </dependencies>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                    </plugin>

                </plugins>
            </build>
        </project>

Modern

Modern · 34 Zeilenmodern/pom.xml
<?xml version="1.0" encoding="UTF-8"?>
        <project xmlns="http://maven.apache.org/POM/4.0.0"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
            <modelVersion>4.0.0</modelVersion>
            <parent>
                <groupId>at.aydin.academy</groupId>
                <artifactId>29osgiserviceregistry-pair</artifactId>
                <version>1.0.0</version>
                <relativePath>../pom.xml</relativePath>
            </parent>
            <artifactId>java-spi-modern</artifactId>
            <packaging>jar</packaging>
            <name>Java SPI Modern</name>

            <dependencies>

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <scope>test</scope>
</dependency>

            </dependencies>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                    </plugin>

                </plugins>
            </build>
        </project>
02Service-Vertrag und Default-ProviderDirektvergleich · Legacy 5 / Modern 14 Zeilen · Ähnlichkeit 43%

Service-Vertrag wird als Provider-SPI mit Implementierung strukturiert.

Legacy-DateienModern-DateienEinordnung
PaymentService.javaPaymentProvider.java
DefaultPaymentProvider.java
Direktvergleich
Semantische Ähnlichkeit: 43%

Legacy

Modern

03Registry/Provider-Auflösung und TestDirektvergleich · Legacy 35 / Modern 20 Zeilen · Ähnlichkeit 25%

Eigene Registry wird durch standardisierte Provider-Auflösung ersetzt.

Legacy-DateienModern-DateienEinordnung
ServiceRegistry.java
ServiceRegistryTest.java
PaymentProviders.java
PaymentProvidersTest.java
Direktvergleich
Semantische Ähnlichkeit: 25%

Legacy

package at.aydin.lab.osgi.legacy;

import java.util.*;

// Design Pattern: Service Registry
// Zweck: Dienste können dynamisch registriert, ersetzt und entfernt werden.
public final class ServiceRegistry {
    private final Map<Class<?>, Object> services = new HashMap<>();
    public <T> void register(Class<T> type, T service) {
        services.put(type, service);
    }

    public void unregister(Class<?> type) {
        services.remove(type);
    }

    public <T> Optional<T> find(Class<T> type) {
        return Optional.ofNullable(type.cast(services.get(type)));
    }
}
package at.aydin.lab.osgi.legacy;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

class ServiceRegistryTest {
    @Test
    void supportsLifecycle() {
        var r = new ServiceRegistry();
        r.register(PaymentService.class, c -> "PAID " + c);
        assertEquals("PAID 100", r.find(PaymentService.class).orElseThrow().pay(100));
        r.unregister(PaymentService.class);
        assertTrue(r.find(PaymentService.class).isEmpty());
    }
}

Modern

package at.aydin.lab.osgi.modern;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

class PaymentProvidersTest {
    @Test
    void discoversProvider() {
        assertEquals("PAID 100", new PaymentProviders().first().pay(100));
    }
}
⌂ Cockpit