Чи можна зробити щось на зразок підписки в Котліні?
@Autowired
internal var mongoTemplate: MongoTemplate
@Autowired
internal var solrClient: SolrClient
Чи можна зробити щось на зразок підписки в Котліні?
@Autowired
internal var mongoTemplate: MongoTemplate
@Autowired
internal var solrClient: SolrClient
Відповіді:
Рекомендованим підходом робити інжекцію залежностей навесні є введення конструктора:
@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
і мають невеликі накладні витрати на час виконання. А щоб перевірити клас за допомогою конструктора, вам не потрібні роздуми.
Посилання:
@Autowired
з основним конструктором?
autowired
by setter?
YourBean
в FooBean
, в разі , коли YourBean
залежність буде опублікований (модифікатор по замовчуванням в Котлин) розробник може використовувати YourBean
залежно в FooBean
( yourBean.mongoTemplate
). Але цього не можна допускати, оскільки YourBean
залежності - це не його державний контракт, це лише деталі реалізації (у більшості випадків). Натомість FooBean
слід визначити власні залежності у власному конструкторі.
Так, анотації Java підтримуються в Kotlin здебільшого, як і в Java. Однією з причин є те, що анотації на первинному конструкторі вимагають явного ключового слова "конструктор":
З https://kotlinlang.org/docs/reference/annotations.html
Якщо вам потрібно анотувати основний конструктор класу, вам потрібно додати ключове слово конструктора до оголошення конструктора та додати анотації перед ним:
class Foo @Inject constructor(dependency: MyDependency) {
// ...
}
Ви також можете автоматично підключати залежності через конструктор. Не забудьте анотувати свої залежності і @Configuration, @Component, @Service
т.д.
import org.springframework.stereotype.Component
@Component
class Foo (private val dependency: MyDependency) {
//...
}