Ist es möglich, in Kotlin so etwas wie zu folgen?
@Autowired
internal var mongoTemplate: MongoTemplate
@Autowired
internal var solrClient: SolrClient
Ist es möglich, in Kotlin so etwas wie zu folgen?
@Autowired
internal var mongoTemplate: MongoTemplate
@Autowired
internal var solrClient: SolrClient
Antworten:
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:
@AutowiredParameter mit dem primären Konstruktor verwenden?
autowiredSetter hinzufügen ?
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.
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) {
// ...
}
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) {
//...
}