Po pierwsze i najważniejsze - wszystkie ziarna jarej są zarządzane - „żyją” w kontenerze, zwanym „kontekstem aplikacji”.
Po drugie, każda aplikacja ma punkt wejścia do tego kontekstu. Aplikacje internetowe mają serwlet, JSF korzysta z el-resolvera itp. Istnieje również miejsce, w którym kontekst aplikacji jest ładowany, a wszystkie komponenty bean - automatycznie. W aplikacjach internetowych może to być odbiornik startowy.
Automatyczne okablowanie odbywa się poprzez umieszczenie instancji jednej fasoli w żądanym polu w instancji innej fasoli. Obie klasy powinny być fasolami, tzn. Powinny być zdefiniowane do życia w kontekście aplikacji.
Co to jest „życie” w kontekście aplikacji? Oznacza to, że kontekst tworzy instancję obiektów, a nie ciebie. To znaczy - nigdy nie robisz new UserServiceImpl()
- pojemnik znajduje każdy punkt wstrzyknięcia i ustawia tam instancję.
W swoich kontrolerach masz tylko:
@Controller // Defines that this class is a spring bean
@RequestMapping("/users")
public class SomeController {
// Tells the application context to inject an instance of UserService here
@Autowired
private UserService userService;
@RequestMapping("/login")
public void login(@RequestParam("username") String username,
@RequestParam("password") String password) {
// The UserServiceImpl is already injected and you can use it
userService.login(username, password);
}
}
Kilka uwag:
- W twojej
applicationContext.xml
należy włączyć <context:component-scan>
tak, że zajęcia są skanowane na @Controller
, @Service
itp adnotacje.
- Punktem wejścia dla aplikacji Spring-MVC jest DispatcherServlet, ale jest ona ukryta przed tobą, a zatem bezpośrednia interakcja i ładowanie kontekstu aplikacji ma miejsce za sceną.
UserServiceImpl
należy również zdefiniować jako fasolę - albo używając, <bean id=".." class="..">
albo używając @Service
adnotacji. Ponieważ będzie to jedyny implementator UserService
, zostanie wstrzyknięty.
- Oprócz
@Autowired
adnotacji, Spring może korzystać z automatycznego okablowania konfigurowanego przez XML. W takim przypadku wszystkie pola, które mają nazwę lub typ pasujący do istniejącej fasoli, są automatycznie wstrzykiwane. W rzeczywistości był to początkowy pomysł automatycznego okablowania - aby pola były wstrzykiwane z zależnościami bez jakiejkolwiek konfiguracji. Inne adnotacje podoba @Inject
, @Resource
może być również używany.
Zależy od tego, czy chcesz trasę adnotacji, czy definicję XML komponentu bean.
Załóżmy, że zdefiniowałeś fasolę w swoim
applicationContext.xml
:Automatyczne okablowanie ma miejsce podczas uruchamiania aplikacji. Tak więc w, w
fooController
którym ze względu na argumenty chce się użyćUserServiceImpl
klasy, należy dodać adnotację w następujący sposób:Kiedy to zobaczy
@Autowired
, Spring wyszuka klasę pasującą do właściwości wapplicationContext
i wstrzykuje ją automatycznie. Jeśli masz więcej niż jednąUserService
fasolę, musisz określić, której z nich powinna użyć.Jeśli wykonasz następujące czynności:
Nie odbierze,
@Autowired
chyba że sam go ustawisz.źródło
bean id
wapplicationContext.xml
. Będziemy musieli zdefiniowaćuserService
zmienną zUserService
typem. Po co więc wprowadzać dane doxml
pliku.@Autowired
to adnotacja wprowadzona wiosną 2.5 i jest używana tylko do iniekcji.Na przykład:
źródło
@Autowired
nie oznacza, że „można użyć wszystkich funkcji (metod) i zmiennych wB
klasie z klasyA
”. To, co robi, przenosi instancjęA
do instancjiB
, więc możesz to zrobića.getId()
zB
.Jak
@Autowired
działa wewnętrznie?Przykład:
Plik .xml będzie wyglądał podobnie, jeśli nie używa
@Autowired
:Jeśli używasz,
@Autowired
to:Plik .xml będzie wyglądał podobnie, jeśli nie używa
@Autowired
:Jeśli nadal masz wątpliwości, przejrzyj poniżej demo na żywo
Jak działa @Autowired wewnętrznie?
źródło
Wystarczy dodać adnotację do swojej klasy usługi za
UserServiceImpl
pomocą adnotacji:Kontener sprężynowy zajmie się cyklem życia tej klasy, rejestrując się jako usługa.
Następnie w kontrolerze możesz go automatycznie połączyć (utworzyć) i użyć jego funkcji:
źródło
Wstrzykiwanie zależności sprężynowej pomaga usunąć sprzężenie z zajęć. Zamiast tworzyć taki obiekt:
Będziesz tego używał po wprowadzeniu DI:
Aby to osiągnąć, musisz utworzyć plik bean swojej usługi w swoim
ServiceConfiguration
pliku. Następnie musisz zaimportować tęServiceConfiguration
klasę do swojejWebApplicationConfiguration
klasy, aby móc automatycznie zapisać tę fasolę w kontrolerze w następujący sposób:Można znaleźć oparciu konfiguracja java POC się tutaj przykładowy .
źródło
Standardowy sposób:
Interfejs usługi użytkownika:
Klasa UserServiceImpl:
Wynik:
Example test UserServiceImpl
To świetny przykład ściśle powiązanych klas, zły przykład projektowania i będzie problem z testowaniem (PowerMockito jest również zły).
Przyjrzyjmy się teraz iniekcji zależności SpringBoot, fajnemu przykładowi luźnego sprzężenia:
Interfejs pozostaje taki sam,
Główna klasa:
Klasa ServiceUserImpl:
Wynik:
Example test UserServiceImpl
a teraz łatwo jest napisać test:
Pokazałem
@Autowired
adnotację na konstruktorze, ale może być również używana na seterie lub polu.źródło
Cała koncepcja inwersji kontroli oznacza, że jesteś wolny od obowiązku ręcznego tworzenia obiektów i zapewniania wszystkich niezbędnych zależności. Gdy dodasz adnotację do klasy z odpowiednią adnotacją (np.
@Service
), Spring automatycznie utworzy dla Ciebie obiekt. Jeśli nie znasz adnotacji, możesz również użyć pliku XML. Jednak nie jest złym pomysłem ręczne tworzenie klas (za pomocąnew
słowa kluczowego) w testach jednostkowych, gdy nie chcesz ładować całego kontekstu wiosny.źródło
Pamiętaj, że musisz włączyć
@Autowired
adnotację, dodając element<context:annotation-config/>
do pliku konfiguracyjnego sprężyny. Spowoduje to zarejestrowanie,AutowiredAnnotationBeanPostProcessor
który zajmuje się przetwarzaniem adnotacji.A następnie możesz automatycznie zarządzać usługą za pomocą metody wstrzykiwania w terenie.
Znalazłem to na podstawie adnotacji Spring @autowired
źródło
Istnieją 3 sposoby utworzenia instancji za pomocą
@Autowired
.1.
@Autowired
na WłaściwościAdnotacji można używać bezpośrednio w właściwościach, co eliminuje potrzebę pobierania i ustawiania:
W powyższym przykładzie Spring szuka i wstrzykuje
userService
poUserController
utworzeniu.2.
@Autowired
w Setters@Autowired
Adnotacja może być stosowany na metod dostępowych. W poniższym przykładzie, gdy adnotacja jest użyta w metodzie setter, metoda setter jest wywoływana z instancjąuserService
kiedyUserController
tworzona jest:3.
@Autowired
na konstruktorach@Autowired
Adnotacja może być również stosowany na konstruktorów. W poniższym przykładzie, gdy adnotacja jest używana w konstruktorze, instancjauserService
jest wprowadzana jako argument do konstruktora podczasUserController
tworzenia:źródło
Krótko mówiąc, automatyczne okablowanie, okablowanie łączy się automatycznie, teraz pojawia się pytanie, kto to robi i jaki rodzaj okablowania. Odpowiedź brzmi: Kontener robi to i Drugi typ okablowania jest obsługiwany, operacje podstawowe należy wykonać ręcznie.
Pytanie: Skąd kontener wie, jaki rodzaj okablowania?
Odpowiedź: Definiujemy go jako byType, byName, konstruktor.
Pytanie: Czy istnieje sposób, w jaki nie definiujemy rodzaju autowiring?
Odpowiedź: Tak, jest tam, wykonując jedną adnotację, @Autowired.
Pytanie: Ale skąd system wie, że muszę wybrać ten typ danych wtórnych?
Odpowiedź: Dostarczysz te dane w swoim pliku spring.xml lub za pomocą adnotacji sterotypowych do swojej klasy, aby kontener mógł sam stworzyć obiekty dla Ciebie.
źródło