Чи можна зробити щось на зразок підписки в Котліні?
@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з основним конструктором?
autowiredby 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) {
//...
}