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:
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.
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:
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:
Sie können Abhängigkeiten auch automatisch über den Konstruktor verdrahten. Denken Sie daran, Ihre Abhängigkeiten mit @Configuration, @Component, @Serviceetc. Zu kommentieren
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
Autowired
folgenden 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:
quelle
@Autowired
Parameter mit dem primären Konstruktor verwenden?autowired
Setter hinzufügen ?YourBean
inFooBean
dem Fall , wennYourBean
Abhängigkeiten öffentliche (Standard Modifier in Kotlin) seinem Entwickler verwenden kannYourBean
Abhängigkeiten inFooBean
(yourBean.mongoTemplate
). Dies sollte jedoch nicht zulässig sein, daYourBean
Abhängigkeiten nicht sein öffentlicher Auftrag sind, sondern nur Implementierungsdetails (in den meisten Fällen). StattdessenFooBean
sollten 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
class Foo @Inject constructor(dependency: MyDependency) { // ... }
quelle
Sie können Abhängigkeiten auch automatisch über den Konstruktor verdrahten. Denken Sie daran, Ihre Abhängigkeiten mit
@Configuration, @Component, @Service
etc. Zu kommentierenimport org.springframework.stereotype.Component @Component class Foo (private val dependency: MyDependency) { //... }
quelle
so wie das
@Component class Girl( @Autowired var outfit: Outfit)
quelle