Ratpack comme je l'ai déjà écrit En enregistrant diverses parties dans la classe «Registry», une architecture modulaire est réalisée. C'est idéal et flexible en soi, mais je pense que le développement à grande échelle nécessitera toujours un conteneur DI à part entière. Ratpack peut utiliser la fonction DI de Google Guice ou Spring comme Registry
.
Guice
Vous pouvez créer un Registry
à partir de la classe ratpack.guice.Guice
. Veuillez noter que le nom est «com.google.inject.Guice». Ceci est un exemple de création d'un Registry
à partir de la classe ʻInjector`.
Injector injector = Guice.createInjector( new CustomModule() );
Registry registry = ratpack.guice.Guice.registry( injector );
Vous pouvez également créer des modules uniquement à partir de l'API dans Ratpack. Le type est Function <Registry, Registry>
, mais vous pouvez le passer directement à RatpackServerSpec.registry ()
.
Function<Registry, Registry> registry = ratpack.guice.Guice.registry( bindings -> {
bindings.module( CustomModule.class );
} );
Il est à noter que l'ajout de modules est affecté dans l'ordre. Le contenu sera écrasé dans le module ajouté ultérieurement.
L'utilisation est la même que celle du Registry
normal. Vous pouvez enregistrer la classe dans l'injecteur de Guice depuis l'API Registry
. Si vous spécifiez un gestionnaire, etc. par le nom de la classe, il sera extrait du conteneur. Puisque l'instance est gérée par Guice, vous pouvez spécifier la dépendance avec @ Inject
comme le code Guice normal.
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 fournit la classe ʻInjectionHandler` pour réduire les plaques chauffantes de Guice.
public static final class CustomInjectionHandler extends InjectionHandler {
public void handle( Context context, Database database ) {
context.render( "CustomInjectionHandler: " + database.find() );
}
}
La classe qui hérite de ʻInjectionHandler implémente une seule fonction avec le nom
handleret
Contextcomme premier argument. Après
Context`, décrivez la dépendance que vous souhaitez injecter en tant qu'argument.
En interne, cela prend la forme d'une délégation de traitement à la méthode par réflexion en réponse à l'appel du gestionnaire.
Compte tenu des performances et du support IDE, je préfère personnellement ne pas l'utiliser beaucoup.
Spring
Vous pouvez créer un Registry
à partir d'un conteneur Spring DI avec la méthode ratpack.spring.Spring.spring ()
.
Registry registry = Spring.spring( Application.class );
La classe spécifiée dans l'argument est la classe avec l'annotation @ SpringBootApplication
. Comme vous le feriez dans une application Spring normale, les composants sont recherchés dans le chemin des classes et ces classes peuvent être récupérées à partir de Registry
.
@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 );
};
Je pense que l'utilisation de conteneurs DI est presque obligatoire dans l'écosystème Java. Ratpack prend en charge deux des conteneurs DI les plus populaires, Guice et Spring. Guice est également utilisé pour intégrer chaque extension Ratpack.
Ratpack et Guice sont étroitement intégrés et la DI elle-même est un moyen puissant de coupler les applications de manière lâche. Nous vous recommandons de l'utiliser de manière positive.
Recommended Posts