W świecie, w którym na co dzień pracujemy z językami programowania, każdy z nas ma tendencję do poszukiwania metod i sztuczek, które ułatwią nam życie. Cóż, wstrzykiwanie zależności jest jedną z takich technik, która ma na celu ułatwienie programistom pomocy poprzez zapewnienie zależności innego obiektu. W tym artykule o czym jest zastrzyk zależności, pomogę ci szczegółowo zrozumieć tę technikę.
W tym artykule zostaną omówione następujące tematy:
- Wprowadzenie do wstrzykiwania zależności
- Odwrócenie sterowania
- Rodzaje iniekcji zależności
- Korzyści z zastrzyku zależności
- Zaimplementuj wstrzykiwanie zależności za pomocą Spring Boot
Więc zacznijmy od tego artykułu.
Co to jest Dependency Injection?
Dependency Injection to zdolność obiektu do dostarczania zależności innego obiektu.
Jestem prawie pewien, że może nic nie zrozumiałeś z powyższej definicji technicznej. Pozwól, że wyjaśnię ci to zamieszanie.
Co przychodzi ci na myśl, kiedy słyszysz termin uzależnienie?
Oczywiście, coś zależy od czegoś innego do wsparcia, prawda?
Cóż, tak samo jest w przypadku programowania.
Zależność w programowaniu to podejście, w którym klasa korzysta z określonych funkcji innej klasy. Na przykład, jeśli weźmiesz pod uwagę dwie klasy A i B i powiesz, że klasa A korzysta z funkcjonalności klasy B, to oznacza, że klasa A ma zależność od klasy B. Teraz, jeśli kodujesz w Javie, musisz wiedzieć że musiszutwórz instancję klasy B, zanim obiekty zostaną użyte przez klasę A.
Tak więc, jeśli muszę teraz zdefiniować dla ciebie Dependency Injection, to proces tworzenia obiektu dla jakiejś innej klasy i niech klasa bezpośrednio korzystająca z zależności nazywa się Dependency Injection. Dotyczy to głównie trzech klas:
Klasa klienta: Jest to klasa zależna i jest zależna od klasy Service.
zmienny i niezmienny w java
Klasa usługi: Ta klasa udostępnia usługę dla klasy klienta.
Klasa wtryskiwacza: Ta klasa jest odpowiedzialna za wstrzyknięcie obiektu klasy usług do klasy klienta
Teraz, kiedy już zrozumiałeś, czym jest Dependency Injection, pozwólcie mi teraz przejść przez zasadę, na której opiera się Dependency Injection.
Odwrócenie sterowania
Jak wspomniałem powyżej, Inversion of Control to zasada, na której opiera się Dependency Injection. Ponadto, jak sama nazwa wskazuje, odwrócenie kontroli jest zasadniczo używane do odwrócenia różnych rodzajów dodatkowych obowiązków klasy, a nie głównej odpowiedzialności.
Jeśli mam ci wyjaśnić prostszymi słowami, rozważ przykład, w którym masz umiejętność gotowania. Zgodnie z zasadą IoC sterowanie można odwrócić, dzięki czemu zamiast gotować jedzenie, możesz po prostu zamówić bezpośrednio z zewnątrz, otrzymując jedzenie na wyciągnięcie ręki. W ten sposób proces jedzenia dostarczanego do domu nazywa się Odwróceniem Kontroli.
Nie musisz sam gotować, zamiast tego możesz zamówić jedzenie i pozwolić dostawcom dostarczyć je za Ciebie. W ten sposób nie musisz zajmować się dodatkowymi obowiązkami i po prostu skupić się na głównej pracy.
Teraz, gdy znasz już zasadę Dependency Injection, pozwól, że przeprowadzę cię przez typy Dependency Injection.
Rodzaje iniekcji zależności
Istnieją głównie trzy typy iniekcji zależności:
Wstrzyknięcie konstruktora: W tego typu iniekcji wtryskiwacz dostarcza zależności za pośrednictwem konstruktora klasy klienta.
Wtrysk setera / wtrysk właściwości: W przypadku tego typu iniekcji metoda wtryskiwacza wstrzykuje zależność do metody ustawiającej udostępnionej przez klienta.
Iniekcja interfejsu: W tego typu iniekcji wtryskiwacz używa interfejsu, aby zapewnić zależność do klasy klienta. Klienci muszą zaimplementować interfejs, który udostępni plikmetoda ustawiającaktóryakceptuje zależność.
Mam nadzieję, że do tej pory zrozumieliście fakt, że Dependency Injection jest odpowiedzialny za tworzenie obiektów, zrozumienie, które klasy wymagają tych obiektów i wreszcie dostarczenie tych klas z obiektami. A więc w tej notatce przyjrzyjmy się teraz korzyściom z Dependency Injection.
Korzyści z zastrzyku zależności
Zanim wymienię zalety Dependency Injection, pozwólcie, że wyjaśnię wam potrzebę tego zastrzyku na poziomie branżowym, aby pomóc wam lepiej zrozumieć korzyści.
Rozważ scenariusz, w którym masz klasę e-maili, której wyłącznym obowiązkiem jest dbanie o otrzymane wiadomości e-mail. Teraz ta klasa będzie zawierała obiekty, takie jak „Na adres e-mail”, „Z adresu e-mail”, „Temat i treść wiadomości e-mail”.
Jeśli firma chce zapisywać wiadomości tekstowe i dźwiękowe, czy myślisz, że ta klasa może zapisać wiadomość?
Cóż, odpowiedź brzmi: nie?
Dzieje się tak, ponieważ klasa Email nie obsługuje parametrów wiadomości tekstowych i audio. W takich przypadkach będziesz musiał ponownie utworzyć klasę. Teraz odtworzenie klasy jest dość uciążliwe, zwłaszcza jeśli musisz to robić regularnie. Zamiast tego, jeśli używasz iniekcji zależności, możesz zmieniać obiekty w czasie wykonywania. W ten sposób nie musisz odtwarzać klasy, co dodatkowo pomaga na wiele sposobów.
Tak więc, jeśli muszę podsumować korzyści płynące z Dependency injection, to następujące są korzyści:
W porządku, więc teraz, gdy znasz już zalety Dependency Injection, przejdźmy dalej i zobaczmy, jak zaimplementować Dependency Injection przy użyciu Spring Boot.
Jak wdrożyć DI przy użyciu Spring Boot?
Krok 1: Otwórz swoje Eclipse IDE i utwórz plik Aplikacja Spring Boot klikając prawym przyciskiem myszy i wybierając Spring Starter Project . Następnie podaj nazwę projektu i kliknij koniec .
Aby uzyskać projekt Spring Starter, musisz zainstalować pakiet Spring Tool Suite z Eclipse Marketplace. W przypadku, gdy nie masz zainstalowanego pakietu Spring Too Suite, możesz zapoznać się z moim artykułem na temat .
Automatycznie zobaczysz, że plik aplikacji jest tworzony jak poniżej.
Krok 2: Następnie utwórz klasę w tym samym pakiecie. Aby to zrobić, kliknij plik prawym przyciskiem myszy -> wybierz Klasa i wspomnij o Nazwa klasy. Następnie kliknij koniec . Spowoduje to utworzenie Klasa plik. Tutaj utworzyłem klasę Klienci. Patrz poniżej.
Krok 3: Następnie wstawmy kilka właściwości dla tej klasy. Powiedzmy więc, że uwzględniamy Identyfikator klienta, nazwa klienta i Nazwa kursu. Wspomnij o kodzie poniżej.
pakiet com.example.demo // nazwa pakietu klasa publiczna Klienci {private int custid private String custname private String coursename}
Krok 3.1: Kiedy już to zrobisz, musisz generuje metody Getter i Setter dla tych właściwości. Aby to zrobić, wybierz te właściwości i kliknij prawym przyciskiem myszy. Następnie wybierz Źródło -> Generuj metody pobierające i ustawiające.
Twój dotychczasowy kod powinien wyglądać następująco:
Programowanie gniazd tcp w java
pakiet com.example.demo klasa publiczna Klienci {private int custid private String custname private String coursename public int getCustid () {return custid} public void setCustid (int custid) {this.custid = custid} public String getCustname () {return custname } public void setCustname (String custname) {this.custname = custname} public String getCoursename () {return coursename} public void setCoursename (String coursename) {this.coursename = coursename}}
Rozważmy teraz scenariusz, w którym musisz utworzyć obiekt dla Klientów i nie chcesz tego robić ręcznie. W takim scenariuszu będziesz musiał użyć Dependency Injection, aby uzyskać obiekty, kiedy tylko tego potrzebujesz.
A zatem przyjrzyjmy się teraz, jak możemy osiągnąć to samo.
Krok 4: Najpierw zmień uruchom linię w plik klasy aplikacji do następujących:
ConfigurableApplicationContext context = SpringApplication.run (DemoApplication.class, args)
Uwaga: jeśli pojawi się błąd, zaimportuj następujące elementy:
import org.springframework.boot.SpringApplication import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.context.ConfigurableApplicationContext
Powyższa linia kodu zwróci obiekt w czasie wykonywania. Teraz dodaj następujący kod do pliku aplikacji.
klienci c = context.getBean (customers.class)
Powyższa linia powie kompilatorowi, aby zwrócił obiekt klasy klienta. Patrz poniżej.
Krok 4.1: Teraz, aby sprawdzić, czy działa, czy nie, ty może wrócić do klasy klienta i dodaj metodę w następujący sposób:
public void display () {System.out.println ('Obiekt został pomyślnie zwrócony')}
Ta metoda po pomyślnym wykonaniu wyświetli wynik „Obiekt zwrócono pomyślnie”.
Krok 4.2: Następnie musisz wrócić do pliku aplikacji i podać następujące informacje:
c.display ()
W ten sposób wywołujesz obiekt klasy Klienci z odwołaniem do metody wyświetlania. Zapoznaj się z poniższym obrazem, aby zobaczyć kod klasy aplikacji do tej pory:
Teraz, jeśli wykonasz projekt, zobaczysz plik wyjątek: Brak kwalifikującej się fasoli typu . Dzieje się tak, ponieważ zdefiniowana przez Ciebie klasa klienta nie jest Spring Bean, tj. Nie jest obiektem Spring. Patrz poniżej.
Krok 4.3: Tak więc, aby poinformować o tym Spring Container, potrzebujemy obiektu klasy customer. Aby to zrobić, musisz wspomnieć o @ Adnotacja komponentu w klasie Customer. Kod w klasie Klienci powinien wyglądać następująco:
pakiet com.example.demo import org.springframework.stereotype.Component @Component public class Klienci {private int custid private String custname private String coursename public int getCustid () {return custid} public void setCustid (int custid) {this.custid = custid} public String getCustname () {return custname} public void setCustname (String custname) {this.custname = custname} public String getCoursename () {return coursename} public void setCoursename (String coursename) {this.coursename = coursename} public void display () {System.out.println ('Obiekt zwrócono pomyślnie')}}
Następnie, gdy wspomnisz o klientach c = context.getBean (customers.class) kompilator sprawdzi, czy w kontenerze jest dostępny komponent bean klienta.
Jeśli Bean jest dostępny, to platforma Spring wstrzykuje obiekt klienta do aplikacji. Tak więc w zasadzie ten obiekt jest tworzony przez framework Spring, który może być dalej używany w aplikacji.
Jeśli więc wykonam teraz ten projekt, zobaczysz wynik, że obiekt został pomyślnie zwrócony. Patrz poniżej.
W ten sposób można wdrożyć Dependency Injection.
Przykład: Dependency Injection przy użyciu Autowired Annotation
Mam nadzieję, że zrozumiałeś, jak działa Dependency Injection w Spring Boot. Rozwińmy teraz ten przykład i zobaczmy, jak klasa zależna od drugiej wykorzystywała funkcje tej klasy w Spring Boot.
Krok 1: Stwórz nowy plik klasy ponownie kliknij pakiet prawym przyciskiem myszy i wybierając Nowy -> Klasa. Teraz podaj nazwę klasy jak poniżej i kliknij Koniec.
Krok 2: Następnie wstawmy kilka właściwości dla klasy. Powiedzmy więc, że uwzględniamy TechID, Techname. Wspomnij o kodzie poniżej.
pakiet com.example.demo public class Technologies {private int techid private String techname}
Krok 2.1: Gdy skończysz, wygeneruj Metody pobierające i ustawiające dla tych właściwości, klikając plik prawym przyciskiem myszy, a następnie wybierając Źródło -> Generuj metody pobierające i ustawiające.
Krok 3: Powiedzmy teraz, że musimy stworzyć metodę, która drukuje „ Odnoszący sukcesy „. Aby to zrobić, podaj kod:
tablica obiektów w java
public void tech () {System.out.println ('Pomyślnie')}
Twój dotychczasowy kod powinien wyglądać jak poniżej:
pakiet com.example.demo publiczna klasa Technologie {prywatny int techid prywatny String nazwa techniczna public int getTechid () {zwrot techid} public void setTechid (int techid) {this.techid = techid} public String getTechname () {zwrot techid} public void setTechname (String techname) {this.techname = techname} public void tech () {System.out.println ('Successful')}}
Krok 4: Teraz, aby zadzwonić do tech () metoda w klasa klientów , musisz stworzyć obiekt z klasy technologii. Więc wspomnij o następującej linii kodu w klasie klientów:
prywatne informacje techniczne dotyczące technologii
Krok 4.1: Gdy skończysz, wygeneruj Metody pobierające i ustawiające dla tych nieruchomości wg kliknij plik prawym przyciskiem myszy a następnie wybierz Źródło -> Generuj metody pobierające i ustawiające.
Krok 5: Następnie, aby użyć tech () metoda musisz wspomnieć techdetail.tech () pod sposób wyświetlania klasy klientów . Ponadto, aby upewnić się, że obiekt techdetail ma instancję, należy wspomnieć @ Adnotacja komponentu jest Klasa technologii. Patrz poniżej.
Teraz, kiedy wykonasz ten projekt, zobaczysz plik Wyjątek zerowego wskaźnika . To dlatego, że teraz Klasa klienta jest zależna od klasy technologii, a mimo to nie wie o istnieniu klasy technologii .
Tak więc, aby umożliwić Klientowi rozpoznanie klasy Technologie, należy wstawić rozszerzenie @Autowired adnotacja w klasie Klienci. Twój ostateczny kod klasy klientów powinien wyglądać następująco:
pakiet com.example.demo import org.springframework.beans.factory.annotation.Autowired import org.springframework.stereotype.Component @Component public class Klienci {private int custid private String custname private String coursename @Autowired private Technologies techdetail public Technologies getTechdetail ( ) {return techdetail} public void setTechdetail (Technologies techdetail) {this.techdetail = techdetail} public int getCustid () {return custid} public void setCustid (int custid) {this.custid = custid} public String getCustname () {return custname } public void setCustname (String custname) {this.custname = custname} public String getCoursename () {return coursename} public void setCoursename (String coursename) {this.coursename = coursename} public void display () {System.out.println ( „Obiekt zwrócono pomyślnie”) techdetail.tech ()}}
Po wykonaniu tych plików zobaczysz dane wyjściowe jako obiekt zwrócony pomyślnie i zakończony powodzeniem, co oznacza, że nasza zależność klas została spełniona. Patrz poniżej.
Gdy skończysz z artykułem, zapoznaj się z autorstwa Edureka, zaufanej firmy zajmującej się edukacją online, z siecią ponad 250 000 zadowolonych uczniów rozsianych po całym świecie.
Masz do nas pytanie? Proszę wspomnieć o tym w sekcji komentarzy w tym artykule „Co to jest zastrzyk zależności? ”Artykuł a my skontaktujemy się z Tobą tak szybko, jak to możliwe.