Wie verwende ich Frühlingsanmerkungen wie @Autowired in Kotlin?

81

Ist es möglich, in Kotlin so etwas wie zu folgen?

@Autowired
internal var mongoTemplate: MongoTemplate

@Autowired
internal var solrClient: SolrClient
Eendroroy
quelle
3
Hast du es versucht? Und um ein bisschen konstruktiver zu sein ... es gibt eine komplette Spring Boot-Vorlage , die Antwort lautet mit Sicherheit "Ja".
Mabi
@abi danke für den Tutorial-Link :)
Eendroroy

Antworten:

182

Der empfohlene Ansatz für die Abhängigkeitsinjektion im Frühjahr ist die Konstruktorinjektion:

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

Vor Spring 4.3 sollte der Konstruktor explizit mit Autowiredfolgenden Anmerkungen versehen werden :

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

In seltenen Fällen möchten Sie möglicherweise die Feldinjektion verwenden, und Sie können dies mit Hilfe von lateinit:

@Component
class YourBean {

    @Autowired
    private lateinit var mongoTemplate: MongoTemplate

    @Autowired
    private lateinit var solrClient: SolrClient
}

Die Konstruktorinjektion überprüft alle Abhängigkeiten zur Bean-Erstellungszeit und alle injizierten Felder sind val, andererseits können nur lateinit injizierte Felder seinvar und haben wenig Laufzeitaufwand. Und um die Klasse mit dem Konstruktor zu testen, brauchen Sie keine Reflexion.

Links:

  1. Dokumentation zu lateinit
  2. Dokumentation zu Konstruktoren
  3. Entwicklung von Spring Boot-Anwendungen mit Kotlin
Ruslan
quelle
Kann ich den @AutowiredParameter mit dem primären Konstruktor verwenden?
Asif Mushtaq
Klar, ich benutze den primären Konstruktor für Injektionen im zweiten und dritten Beispiel.
Ruslan
Können Sie auch den By autowiredSetter hinzufügen ?
Asif Mushtaq
@IRus, Sie haben in Ihrem Beispiel private Werte verwendet, aber ich würde sagen, dass 80% aller Beispiele, die ich im Internet gefunden habe, ohne "privaten" Modifikator auskommen, wenn es um Kotlin geht. Das würde in Java als Codegeruch angesehen werden. Was ist der Grund dafür? Weißt du zufällig? Ich denke sogar, dass es eine separate Frage verdient.
Yuranos
@ yuranos87 dass Entwickler einspritzt Stellen YourBeanin FooBeandem Fall , wenn YourBeanAbhängigkeiten öffentliche (Standard Modifier in Kotlin) seinem Entwickler verwenden kann YourBeanAbhängigkeiten in FooBean( yourBean.mongoTemplate). Dies sollte jedoch nicht zulässig sein, da YourBeanAbhängigkeiten nicht sein öffentlicher Auftrag sind, sondern nur Implementierungsdetails (in den meisten Fällen). Stattdessen FooBeansollten eigene Abhängigkeiten im eigenen Konstruktor definiert werden.
Ruslan
6

Ja, Java-Annotationen werden in Kotlin hauptsächlich wie in Java unterstützt. Ein Problem ist, dass Anmerkungen zum primären Konstruktor das explizite Schlüsselwort 'Konstruktor' erfordern:

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

Wenn Sie den primären Konstruktor einer Klasse mit Anmerkungen versehen müssen, müssen Sie das Konstruktorschlüsselwort zur Konstruktordeklaration hinzufügen und die Anmerkungen davor hinzufügen:

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

Sie können Abhängigkeiten auch automatisch über den Konstruktor verdrahten. Denken Sie daran, Ihre Abhängigkeiten mit @Configuration, @Component, @Serviceetc. Zu kommentieren

import org.springframework.stereotype.Component

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

so wie das

@Component class Girl( @Autowired var outfit: Outfit)
Nankai
quelle