Jak używać wiosennych adnotacji, takich jak @Autowired w Kotlinie?

84

Czy można zrobić coś takiego jak podążanie w Kotlinie?

@Autowired
internal var mongoTemplate: MongoTemplate

@Autowired
internal var solrClient: SolrClient
eendroroy
źródło
3
Czy próbowałeś? Żeby być bardziej konstruktywnym… istnieje cały szablon Spring Boot , odpowiedź z pewnością brzmi „tak”.
mabi
@mabi dziękuję za link do samouczka :)
eendroroy

Odpowiedzi:

187

Zalecanym podejściem do iniekcji zależności w Spring jest wstrzyknięcie konstruktora:

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

Przed Spring 4.3 konstruktor powinien być jawnie oznaczony Autowired:

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

W rzadkich przypadkach możesz chcieć użyć iniekcji w terenie i możesz to zrobić za pomocą lateinit:

@Component
class YourBean {

    @Autowired
    private lateinit var mongoTemplate: MongoTemplate

    @Autowired
    private lateinit var solrClient: SolrClient
}

Wstrzyknięcie konstruktora sprawdza wszystkie zależności w czasie tworzenia fasoli, a wszystkie wstrzyknięte pola są val, z drugiej strony pola wstrzyknięte w Lateinit mogą być tylko vari mają niewielki narzut w czasie wykonywania. Aby przetestować klasę za pomocą konstruktora, nie potrzebujesz refleksji.

Spinki do mankietów:

  1. Dokumentacja na temat lateinit
  2. Dokumentacja dotycząca konstruktorów
  3. Tworzenie aplikacji Spring Boot z Kotlin
Rusłan
źródło
czy mogę użyć parametru @Autowiredwith primary constructor?
Asif Mushtaq
Jasne, używam głównego konstruktora do iniekcji w drugim i trzecim przykładzie.
Rusłan
Czy możesz również dodać autowiredprzez setera?
Asif Mushtaq
@IRus, w swoim przykładzie użyłeś prywatnych wartości, ale powiedziałbym, że 80% wszystkich przykładów, które znalazłem w Internecie, nie zawiera „prywatnego” modyfikatora, jeśli chodzi o Kotlin. Można by to uznać za zapach kodu w Javie. Jaki jest tego powód? Nie wiesz przypadkiem? Myślę nawet, że zasługuje na osobne pytanie.
yuranos
@ yuranos87 wyobrazić, że wstrzykuje programistów YourBeanw FooBean, w przypadku gdy YourBeanZależności będą publiczne (domyślnie modyfikator w Kotlin) deweloper może korzystać z YourBeanzależnościami w FooBean( yourBean.mongoTemplate). Ale to nie powinno być dozwolone, ponieważ YourBeanzależności nie są jego zamówieniem publicznym, to tylko szczegóły implementacji (w większości przypadków). Zamiast tego FooBeannależy zdefiniować własne zależności we własnym konstruktorze.
Rusłan
6

Tak, adnotacje java są obsługiwane w Kotlinie głównie tak, jak w Javie. Jedna gotcha to adnotacje na głównym konstruktorze wymaga jawnego słowa kluczowego „constructor”:

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

Jeśli chcesz dodać adnotację do głównego konstruktora klasy, musisz dodać słowo kluczowe constructor do deklaracji konstruktora i dodać adnotacje przed nim:

class Foo @Inject constructor(dependency: MyDependency) {
  // ...
}
Mike Buhot
źródło
4

Zależności można również automatycznie połączyć za pomocą konstruktora. Pamiętaj, aby dodać adnotacje do swoich zależności @Configuration, @Component, @Serviceitp

import org.springframework.stereotype.Component

@Component
class Foo (private val dependency: MyDependency) {
    //...
}
Panie Turtle
źródło
0

tak

@Component class Girl( @Autowired var outfit: Outfit)
Nankai
źródło