Як використовувати весняні анотації типу @Autowired у kotlin?


84

Чи можна зробити щось на зразок підписки в Котліні?

@Autowired
internal var mongoTemplate: MongoTemplate

@Autowired
internal var solrClient: SolrClient

3
Ти намагався? І щоб бути трохи конструктивнішим .. існує цілий шаблон Spring Boot , відповідь, безумовно, "так".
mabi

@mabi дякую за посилання підручника :)
eendroroy

Відповіді:


187

Рекомендованим підходом робити інжекцію залежностей навесні є введення конструктора:

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

До Spring 4.3 конструктор повинен бути явно анотований Autowired:

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

У рідкісних випадках вам може сподобатися використовувати польову ін'єкцію, і ви можете зробити це за допомогою lateinit:

@Component
class YourBean {

    @Autowired
    private lateinit var mongoTemplate: MongoTemplate

    @Autowired
    private lateinit var solrClient: SolrClient
}

Інжектор конструктора перевіряє всі залежності під час створення компонента, і всі інжектовані поля є val, з іншого боку, ін'єктовані латенітні поля можуть бути лише varі мають невеликі накладні витрати на час виконання. А щоб перевірити клас за допомогою конструктора, вам не потрібні роздуми.

Посилання:

  1. Документація про латеніт
  2. Документація щодо конструкторів
  3. Розробка додатків Spring Boot за допомогою Kotlin

Чи можу я використовувати параметр @Autowiredз основним конструктором?
Асіф Муштак

Звичайно, я використовую первинний конструктор для ін’єкцій у другому та третьому прикладі.
Руслан

Чи можете ви також додати autowiredby setter?
Асіф Муштак

@IRus, ти використовував приватний vals у своєму прикладі, але я б сказав, що 80% усіх прикладів, які я знайшов в Інтернеті, приходять без модифікатора "private", коли мова йде про Kotlin. Це вважається запахом коду в Java. Яка причина цього? Ви випадково знаєте? Я навіть думаю, що це заслуговує окремого питання.
yuranos

@ Yuranos87 Уявіть , що впорскує розробників YourBeanв FooBean, в разі , коли YourBeanзалежність буде опублікований (модифікатор по замовчуванням в Котлин) розробник може використовувати YourBeanзалежно в FooBean( yourBean.mongoTemplate). Але цього не можна допускати, оскільки YourBeanзалежності - це не його державний контракт, це лише деталі реалізації (у більшості випадків). Натомість FooBeanслід визначити власні залежності у власному конструкторі.
Руслан

6

Так, анотації Java підтримуються в Kotlin здебільшого, як і в Java. Однією з причин є те, що анотації на первинному конструкторі вимагають явного ключового слова "конструктор":

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

Якщо вам потрібно анотувати основний конструктор класу, вам потрібно додати ключове слово конструктора до оголошення конструктора та додати анотації перед ним:

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

4

Ви також можете автоматично підключати залежності через конструктор. Не забудьте анотувати свої залежності і @Configuration, @Component, @Serviceт.д.

import org.springframework.stereotype.Component

@Component
class Foo (private val dependency: MyDependency) {
    //...
}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.