Czy można zrobić coś takiego jak podążanie w Kotlinie?
@Autowired
internal var mongoTemplate: MongoTemplate
@Autowired
internal var solrClient: SolrClient
Czy można zrobić coś takiego jak podążanie w Kotlinie?
@Autowired
internal var mongoTemplate: MongoTemplate
@Autowired
internal var solrClient: SolrClient
Odpowiedzi:
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:
@Autowiredwith primary constructor?
autowiredprzez setera?
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.
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) {
// ...
}
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) {
//...
}