web-dev-qa-db-fra.com

Comment utiliser les annotations printanières telles que @Autowired dans kotlin?

Est-il possible de faire quelque chose comme suivre à Kotlin?

@Autowired
internal var mongoTemplate: MongoTemplate

@Autowired
internal var solrClient: SolrClient
56
eendroroy

Bien sûr, c'est possible, vous avez peu d'options, je suggère un constructeur annoté, mais Lateinit fonctionne aussi, et peut-être utile dans certains cas:

Lateinit:

@Component
class YourBean {

    @Autowired
    lateinit var mongoTemplate: MongoTemplate

    @Autowired
    lateinit var solrClient: SolrClient
}

Constructeur:

@Component
class YourBean @Autowired constructor(
    private val mongoTemplate: MongoTemplate, 
    private val solrClient: SolrClient
) {
  // code
}

Constructeur avec Spring 4.3:

@Component
class YourBean(
    private val mongoTemplate: MongoTemplate, 
    private val solrClient: SolrClient
) {
  // code
}

La version du constructeur vérifie toutes les dépendances au moment de la création du bean et tous les champs injectés - val, mais les champs injectés tardivement ne peuvent être que var et leur encombrement d'exécution est faible. Et pour tester la classe avec un constructeur, vous n'avez pas besoin de réflexion.

Liens:

  1. Documentation sur lateinit
  2. Documentation sur les constructeurs
  3. Développement d'applications Spring Boot avec Kotlin
124
Ruslan

Oui, Java sont supportées dans Kotlin, essentiellement comme en Java. Un des pièges à éviter est que les annotations sur le constructeur principal nécessitent le mot-clé explicite 'constructor':

De https://kotlinlang.org/docs/reference/annotations.html

Si vous devez annoter le constructeur principal d'une classe, vous devez ajouter le mot clé constructor à la déclaration du constructeur, puis ajouter les annotations qui la précèdent:

class Foo @Inject constructor(dependency: MyDependency) {
  // ...
}
5
Mike Buhot

Vous pouvez également autoriser les dépendances via le constructeur. N'oubliez pas d'annoter vos dépendances avec @Configuration, @Component, @Service etc

import org.springframework.stereotype.Component

@Component
class Foo (private val dependency: MyDependency) {
    //...
}
0
Mr.Turtle