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.
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”:
Jeśli chcesz dodać adnotację do głównego konstruktora klasy, musisz dodać słowo kluczowe constructor do deklaracji konstruktora i dodać adnotacje przed nim:
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
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ć tylkovar
i mają niewielki narzut w czasie wykonywania. Aby przetestować klasę za pomocą konstruktora, nie potrzebujesz refleksji.Spinki do mankietów:
źródło
@Autowired
with primary constructor?autowired
przez setera?YourBean
wFooBean
, w przypadku gdyYourBean
Zależności będą publiczne (domyślnie modyfikator w Kotlin) deweloper może korzystać zYourBean
zależnościami wFooBean
(yourBean.mongoTemplate
). Ale to nie powinno być dozwolone, ponieważYourBean
zależności nie są jego zamówieniem publicznym, to tylko szczegóły implementacji (w większości przypadków). Zamiast tegoFooBean
należ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
class Foo @Inject constructor(dependency: MyDependency) { // ... }
źródło
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, @Service
itpimport org.springframework.stereotype.Component @Component class Foo (private val dependency: MyDependency) { //... }
źródło
tak
@Component class Girl( @Autowired var outfit: Outfit)
źródło