2016-02-18 5 views
22

Kann man in Kotlin so etwas wie folgen?wie man Frühlingsanmerkungen wie @Autowired in kotlin benutzt?

@Autowired 
internal var mongoTemplate: MongoTemplate 

@Autowired 
internal var solrClient: SolrClient 
+1

Haben Sie versucht? Und um ein bisschen konstruktiver zu sein ... es gibt ein komplettes [Spring Boot Template] (https://kotlinglang.org/docs/tutorials/spring-boot-restful.html), die Antwort ist ganz sicher "Ja". – mabi

+0

@mabi danke für den Tutorial-Link :) – eendroroy

Antwort

53

Für sicher, dass dies möglich ist, haben Sie einige Optionen, schlage ich vor, kommentierte Konstruktor, aber lateinit auch funktioniert, und vielleicht in einigen Fällen nützlich:

Lateinit:

@Component 
class YourBean { 

    @Autowired 
    lateinit var mongoTemplate: MongoTemplate 

    @Autowired 
    lateinit var solrClient: SolrClient 
} 

Constructor:

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

Constructor mit Frühling 4.3:

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

Constructor Versionsprüfung alle Abhängigkeiten auf Bohnenerstellungszeit und alle injizierten Felder - val, andererseits können spät injizierte Felder sein nur var, und haben wenig Laufzeit Fußabdruck. Und um die Klasse mit dem Konstruktor zu testen, braucht man keine Reflexion.

Links:

  1. Documentation on lateinit
  2. Documentation on constructors
  3. Developing Spring Boot applications with Kotlin
5

Ja, Java-Annotationen werden in Kotlin meist wie in Java unterstützt. Ein Gotcha ist Anmerkungen auf dem primären Konstruktor erfordert die explizite ‚Konstruktor‘ Stichwort:

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

Wenn Sie den primären Konstruktor einer Klasse zu annotieren müssen, müssen Sie den Konstruktor Schlüsselwort der hinzufügen Konstruktor Erklärung, und fügen Sie die Anmerkungen, bevor es:

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