Pierwszy application.yml profil konfiguracji wygląda następująco:
Projekt Maven pom.xml dodanie pakietów:
Stwórz nowy obiekt mapowany z następującym kodem:
Typ ciągu musi wymagać twórcy, aby otrzymać wartości właściwości; Mapy, kolekcje i tablice nie są wymagane
Użyj @Autowired adnotacji do automatycznego wstrzykiwania, jak pokazano na poniższym obrazku:
esConfig zawsze daje null, długo szukałem rozwiązania, ale nie powiódł się, poniżej znajduje się rozwiązanie.
Stwórzmy nowy kontroler, kod wygląda następująco:
Wstrzyknięcie kończy się sukcesem, a wartości pliku konfiguracyjnego yml są uzyskiwane normalnie, w następujący sposób:
Powody, dla których EsClient nie może być skutecznie wstrzyknięty, są następujące:
Zwołajmy funkcję tej klasy w konstruktorze, a zmienna @Autowired tej klasy jest używana w tej funkcji.
Pomyślałam więc, że może coś pójść nie tak. Ponieważ @Autowired trzeba poczekać na skonstruowanie klasy, zanim będzie można ją ustawić z zewnętrznych referencji. Dlatego czas wstrzyknięcia @Autowired musi być późniejszy niż czas wykonania konstruktora. Rozwiązanie:
Spring Team zaleca: "Zawsze stosuj zastrzyk zależności oparty na konstruktorach w ziarnach. Zawsze używaj asercji dla obowiązkowych zależności".
Tłumaczenie:
Spring sugeruje: "Zawsze ustanawiaj wstrzykiwanie zależności z konstruktorami w ziarnie. zawsze używaj asercji, aby wymusić zależności".
Oryginalne teksty:
Zmodyfikowane pismo:
PS: Kolejność inicjalizacji zmiennych Java to: zmienne statyczne lub statyczne bloki instrukcji – > zmienne instancyjne lub bloki instrukcji inicjalizacji – >metoda konstrukcyjna – >@Autowired
Dlaczego więc dodaje ostatni typ do zmiennej członka?
W Internecie jest następujące wyjaśnienie: zakres domyślnego ziarna w konfiguracji sprężynowej to singleton, który zawsze jest dostępny po uruchomieniu. Oświadcz, że obiekt ziarna jest tworzony dynamicznie, ustawiając właściwość zakresu na prototyp. Jednak jeśli sama usługa jest singleton, iniekcja jest wykonywana tylko raz.
@Autowired sam jest trybem singleton, zostanie wykonany tylko raz na początku programu i nie inicjalizuje drugiego razu, nawet jeśli nie definiuje ostatecznego etapu, więc ten final nie ma znaczenia.
Może to mieć na celu uniemożliwienie ponownego uruchomienia konstruktora podczas działania programu;
A może jest łatwiej zrozumieć, a finale iinicializuje się tylko raz po uruchomieniu programu.
|