Spring et Kotlin
Introduction
Pour ce chapitre, nous considérons que vous connaissez au moins les bases de la programmation avec le langage Kotlin. Vous pouvez vous appuyer sur l’ouvrage Kotlin - Les fondamentaux du langage de Ludovic Roland aux Éditions ENI si besoin. Nous verrons ici surtout son utilisation avec Spring.
Kotlin, un langage à typage statique, créé par JetBrain, qui cible principalement la JVM et d’autres plateformes, se distingue par sa capacité à permettre l’écriture d’un code à la fois concis et élégant. Ce langage se caractérise également par une interopérabilité remarquable avec les bibliothèques Java existantes. Le framework Spring, reconnaissant les atouts de Kotlin, lui offre un support de premier ordre. Cette intégration permet aux développeurs de créer des applications en Kotlin avec une aisance quasi naturelle, comme si Spring avait été conçu spécifiquement pour Kotlin. D’ailleurs, la documentation de référence de Spring fait preuve de cette intégration en fournissant la plupart de ses exemples de code en Kotlin ainsi qu’en Java. Nous allons explorer dans un premier temps comment Kotlin s’utilise avec le framework Spring, puis nous nous pencherons sur son utilisation avec Spring Boot.
Pour les développements très...
Framework Spring
Le framework Spring est compatible avec Kotlin 1.3 et ses versions ultérieures. Pour une utilisation efficace, nous devons inclure kotlin-stdlib (ou ses variantes telles que kotlin-stdlib-jdk8) et kotlin-reflect dans le classpath. Lorsque nous démarrons un projet Kotlin via start.spring.io, ces bibliothèques sont automatiquement incluses. Au moment de la rédaction de cet ouvrage, Spring ne prend pas encore en charge les classes inline de Kotlin. Pour la sérialisation et la désérialisation JSON des classes Kotlin avec Jackson, le module Jackson pour Kotlin est indispensable. Nous devons donc nous assurer d’ajouter la dépendance com.fasterxml.jackson.module:jackson-module-kotlin à notre projet si la gestion de données JSON est requise. Ce module est intégré automatiquement lorsqu’il est présent dans le classpath.
Les extensions Kotlin, qui permettent d’ajouter des fonctionnalités supplémentaires à des classes existantes, sont un atout majeur. Nous utilisons ces extensions dans Spring pour améliorer nos API existantes avec des fonctionnalités spécifiquement adaptées à Kotlin. Toutes les extensions Kotlin et les langages spécifiques au domaine (DSL) disponibles sont détaillés et expliqués dans la documentation API KDoc de Spring, accessible ici : https://docs.spring.io/spring-framework/docs/current/kdoc-api/.
Pour exploiter ces extensions Kotlin, il est important de les importer dans notre projet. Par exemple, l’extension GenericApplicationContext.registerBean de Kotlin est disponible uniquement si org.springframework.context.support.registerBean est importé. Généralement, un IDE moderne suggère automatiquement ces imports.
Les paramètres de type réifié de Kotlin offrent une solution aux limitations de l’effacement de type des génériques JVM. Spring a des extensions spéciales pour tirer parti de cette caractéristique de Kotlin, améliorant ainsi l’API pour des outils tels que RestTemplate, le nouveau WebClient de Spring WebFlux, et d’autres API.
De plus, d’autres bibliothèques comme Reactor et Spring Data proposent également des extensions Kotlin pour leurs API. Cela enrichit l’expérience globale de...
Spécificités des projets Spring en Kotlin
Dans Kotlin, toutes les classes sont finales par défaut, et pour permettre l’héritage, le modificateur open doit être utilisé, à l’inverse du final de Java. Cette règle s’applique aussi aux fonctions membres, qui doivent être marquées comme open pour autoriser leur surcharge. Bien que la conception de Kotlin soit généralement compatible avec la JVM et Spring, cette caractéristique peut poser des problèmes lors du démarrage de l’application si elle n’est pas correctement gérée. Cela est dû au fait que Spring proxyfie habituellement les beans, comme les classes annotées avec @Configuration, en utilisant CGLIB. La solution classique consiste à ajouter le mot-clé open à chaque classe et fonction membre des beans Spring concernés par ce proxy, mais cela peut s’avérer fastidieux et contraire au principe de concision et de prévisibilité de Kotlin. Pour contourner l’utilisation de proxies CGLIB sur les classes de configuration, nous pouvons utiliser @Configuration(proxyBeanMethods = false).
Heureusement, Kotlin propose le plugin kotlin-spring (une version préconfigurée du plugin kotlin-allopen), qui ouvre automatiquement les classes et leurs fonctions membres pour les types annotés ou méta-annotés avec certaines annotations comme @Component, @Async, @Transactional, @Cacheable. Grâce au support des méta-annotations, les types annotés avec @Configuration, @Controller, @RestController, @Service ou @Repository sont automatiquement ouverts, car ces annotations sont méta-annotées avec @Component. Sur start.spring.io, le plugin kotlin-spring est activé par défaut. Ainsi, dans la pratique...
Points clés
Points à retenir :
-
Kotlin pourrait remplacer Java et utiliser la JVM.
-
Spring a énormément travaillé sur l’intégration de Kotlin.
-
JetBrains qui fait l’excellent IntelliJ IDEA a créé un langage très puissant.
-
Il est possible de convertir du Java en Kotlin via un copier/coller dans IntelliJ IDEA.