Ratpack wie ich zuvor geschrieben habe Durch die Registrierung verschiedener Teile in der Klasse "Registry" wird eine modulare Architektur realisiert. Es ist an sich ideal und flexibel, aber ich denke, für eine groß angelegte Entwicklung wird immer noch ein vollwertiger DI-Container erforderlich sein. Ratpack kann die DI-Funktion von Google Guice oder Spring als "Registrierung" verwenden.
Guice
Sie können eine "Registrierung" aus der "ratpack.guice.Guice" -Klasse erstellen. Bitte beachten Sie, dass der Name "com.google.inject.Guice" lautet. Dies ist ein Beispiel für das Erstellen einer Registrierung aus der Klasse "Injector".
Injector injector = Guice.createInjector( new CustomModule() );
Registry registry = ratpack.guice.Guice.registry( injector );
Sie können Module auch nur über die API in Ratpack erstellen. Der Typ ist "Function <Registry, Registry>", aber Sie können ihn direkt an "RatpackServerSpec.registry ()" übergeben.
Function<Registry, Registry> registry = ratpack.guice.Guice.registry( bindings -> {
bindings.module( CustomModule.class );
} );
Es ist zu beachten, dass das Hinzufügen von Modulen in der richtigen Reihenfolge betroffen ist. Der Inhalt wird in dem später hinzugefügten Modul überschrieben.
Die Verwendung entspricht der normalen Registrierung. Sie können die Klasse in Guices Injektor über die Registrierungs-API registrieren lassen. Wenn Sie einen Handler usw. anhand des Klassennamens angeben, wird dieser aus dem Container abgerufen. Da die Instanz von Guice verwaltet wird, können Sie die Abhängigkeit wie bei normalem Guice-Code mit "@ Inject" angeben.
public final class CustomHandler implements Handler {
private Database database;
@Inject
public CustomHandler( Database database ) {
this.database = database;
}
@Override
public void handle( Context ctx ) throws Exception {
ctx.render( "CustomHandler: " + database.find() );
}
}
Action<Chain> handlers = chain -> {
chain.all( CustomHandler.class );
};
InjectionHandler
Ratpack bietet die InjectionHandler-Klasse, um die Kesselplatten von Guice zu reduzieren.
public static final class CustomInjectionHandler extends InjectionHandler {
public void handle( Context context, Database database ) {
context.render( "CustomInjectionHandler: " + database.find() );
}
}
Die Klasse, die "InjectionHandler" erbt, heißt "Handler" und implementiert nur eine Funktion mit "Context" als erstem Argument. Beschreiben Sie nach "Kontext" die Abhängigkeit, die Sie als Argument einfügen möchten. Intern erfolgt die Delegierung der Verarbeitung an die Methode durch Reflexion als Antwort auf den Handleraufruf. In Anbetracht der Leistung und der IDE-Unterstützung ziehe ich es persönlich vor, sie nicht häufig zu verwenden.
Spring
Sie können eine Registrierung aus einem Spring DI-Container mit der Methode ratpack.spring.Spring.spring () erstellen.
Registry registry = Spring.spring( Application.class );
Die im Argument angegebene Klasse ist die Klasse mit der Annotation @ SpringBootApplication
. Wie in einer normalen Spring-Anwendung werden die Komponenten im Klassenpfad durchsucht und diese Klassen können aus der Registrierung abgerufen werden.
@Service
public class CustomRenderer implements Handler {
private final CustomRepository repository;
@Autowired
public CustomRenderer( CustomRepository repository ) {
this.repository = repository;
}
@Override
public void handle( Context ctx ) throws Exception {
ctx.render( "Hello from Spring Boot!" );
}
}
@Repository
public static class CustomRepository {
public String find() {
return "This is the mock database.";
}
}
Action<Chain> handlers = chain -> {
chain.all( CustomRenderer.class );
};
Ich denke, die Verwendung von DI-Containern ist im Java-Ökosystem fast obligatorisch. Ratpack bietet Unterstützung für zwei der beliebtesten DI-Container, Guice und Spring. Guice wird auch verwendet, um jede Ratpack-Erweiterung zu integrieren.
Ratpack und Guice sind eng miteinander verbunden, und DI selbst ist eine leistungsstarke Möglichkeit, Anwendungen lose zu koppeln. Wir empfehlen, dass Sie es positiv verwenden.
Recommended Posts