Eigene dynamische Service Registry
Services werden zur Laufzeit explizit registriert, ersetzt und entfernt.
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.
Services werden zur Laufzeit explizit registriert, ersetzt und entfernt.
Provider werden über META-INF/services beziehungsweise Modulmetadaten entdeckt.
Die Ähnlichkeit ist eine technische Orientierung auf normalisiertem Quelltext. Sie ersetzt keine fachliche Bewertung.
| Vergleichsgruppe | Legacy-Dateien | Modern-Dateien | Legacy-Zeilen | Modern-Zeilen | Ähnlichkeit |
|---|---|---|---|---|---|
| Build-Konfiguration | 1 | 1 | 34 | 34 | 97% |
| Service-Vertrag und Default-Provider | 1 | 2 | 5 | 14 | 43% |
| Registry/Provider-Auflösung und Test | 2 | 2 | 35 | 20 | 25% |
Das Pair-POM bindet die Legacy- und Modern-Submodule zusammen und gehört deshalb ebenfalls zur vollständigen Codeabdeckung.
Registry-/ServiceLoader-Konfiguration wird verglichen.
| Legacy-Dateien | Modern-Dateien | Einordnung |
|---|---|---|
| pom.xml | pom.xml | Direktvergleich Semantische Ähnlichkeit: 97% |
<?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><?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>Service-Vertrag wird als Provider-SPI mit Implementierung strukturiert.
| Legacy-Dateien | Modern-Dateien | Einordnung |
|---|---|---|
| PaymentService.java | PaymentProvider.java DefaultPaymentProvider.java | Direktvergleich Semantische Ähnlichkeit: 43% |
package at.aydin.lab.osgi.legacy;
public interface PaymentService {
String pay(int cents);
}package at.aydin.lab.osgi.modern;
// Design Pattern: Service Provider Interface
// Zweck: Provider werden ohne zentrale Registry über Standard-Java-Metadaten entdeckt.
public interface PaymentProvider {
String pay(int cents);
}package at.aydin.lab.osgi.modern;
public final class DefaultPaymentProvider implements PaymentProvider {
public String pay(int cents) {
return "PAID " + cents;
}
}Eigene Registry wird durch standardisierte Provider-Auflösung ersetzt.
| Legacy-Dateien | Modern-Dateien | Einordnung |
|---|---|---|
| ServiceRegistry.java ServiceRegistryTest.java | PaymentProviders.java PaymentProvidersTest.java | Direktvergleich Semantische Ähnlichkeit: 25% |
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());
}
}package at.aydin.lab.osgi.modern;
import java.util.*;
public final class PaymentProviders {
public PaymentProvider first() {
return ServiceLoader.load(PaymentProvider.class).findFirst().orElseThrow();
}
}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));
}
}