Proljeće @ Uvoz napomena

1. Pregled

U ovom uputstvu naučit ćemo kako se koristi Proljeće @Uvoz napomena dok pojašnjava po čemu se razlikuje od @Skeniranje komponenata.

2. Konfiguracija i grah

Prije razumijevanja @Uvoz napomena, moramo znati što je Spring Bean i imati osnovno radno znanje o @Konfiguracija bilješka.

Obje su teme izvan dosega ovog vodiča. Ipak, o njima možemo saznati u našem članku Spring Bean i u proljetnoj dokumentaciji.

Pretpostavimo da smo se već pripremili tri graha - Ptica, Mačka, i Pas - svaka sa svojom klasi konfiguracije.

Onda, možemo pružite naš kontekst s njima Config razreda:

@ExtendWith (SpringExtension.class) @ContextConfiguration (class = {BirdConfig.class, CatConfig.class, DogConfig.class}) class ConfigUnitTest {@Autowired ApplicationContext context; @Test void givenImportedBeans_whenGettingEach_shallFindIt () {assertThatBeanExists ("dog", Dog.class); assertThatBeanExists ("mačka", kat.razred); assertThatBeanExists ("ptica", Bird.class); } privatna praznina assertThatBeanExists (String beanName, Class beanClass) {Assertions.assertTrue (context.containsBean (beanName)); Assertions.assertNotNull (context.getBean (beanClass)); }}

3. Grupiranje konfiguracija sa @Uvoz

Nema problema u deklariranju svih konfiguracija. Ali zamislite problem s upravljanjem desecima konfiguracijskih klasa unutar različitih izvora. Trebao bi postojati bolji način.

@Uvoz anotacija ima rješenje svojom sposobnošću grupiranja Konfiguracija klase:

@Configuration @Import ({DogConfig.class, CatConfig.class}) klasa MammalConfiguration {}

Sada se samo trebamo sjetiti sisavci:

@ExtendWith (SpringExtension.class) @ContextConfiguration (classes = {MammalConfiguration.class}) class ConfigUnitTest {@Autowired ApplicationContext context; @Test void givenImportedBeans_whenGettingEach_shallFindOnlyTheImportedBeans () {assertThatBeanExists ("pas", dog.class); assertThatBeanExists ("mačka", kat.razred); Assertions.assertFalse (context.containsBean ("ptica")); } privatna praznina assertThatBeanExists (String beanName, Class beanClass) {Assertions.assertTrue (context.containsBean (beanName)); Assertions.assertNotNull (context.getBean (beanClass)); }}

Pa, vjerojatno ćemo zaboraviti svoje Ptica uskoro, pa učinimo još jedna grupa koja uključuje sve životinja klase konfiguracije:

@Configuration @Import ({MammalConfiguration.class, BirdConfig.class}) klasa AnimalConfiguration {}

Napokon, nitko nije ostao iza nas, a mi se trebamo sjetiti samo jednog razreda:

@ExtendWith (SpringExtension.class) @ContextConfiguration (classes = {AnimalConfiguration.class}) class AnimalConfigUnitTest {// isti test koji potvrđuje da su svi grah dostupni u kontekstu}

4. @Uvoz nasuprot @ComponentScan

Prije nastavka s @Uvoz primjeri, hajde da se brzo zaustavimo i usporedimo s @Skeniranje komponenata.

4.1. Sličnosti

Obje bilješke mogu prihvatiti bilo koji @Komponenta ili @Konfiguracija razred.

Dodajmo novi @Komponenta pomoću @Uvoz:

@Configuration @Import (Bug.class) klasa BugConfig {} @Component (value = "bug") klasa Bug {}

Sada, Bug grah je dostupan kao i svaki drugi grah.

4.2. Konceptualna razlika

Jednostavno rečeno, mi može doći do istog rezultata s obje bilješke. Pa, postoji li razlika između njih?

Da bismo odgovorili na ovo pitanje, sjetimo se da Spring općenito promiče pristup prekomjerne konfiguracije.

Praveći analogiju s našim bilješkama, @Skeniranje komponenata je više poput konvencije, dok @Uvoz izgleda kao konfiguracija .

4.3. Što se događa u stvarnim aplikacijama

Obično pokrećemo naše aplikacije pomoću @Skeniranje komponenata u korijenskom paketu kako bi mogao pronaći sve komponente za nas. Ako koristimo Spring Boot, onda @SpringBootApplication već uključuje @ComponentScan, i spremni smo za polazak. To pokazuje snagu konvencije.

Zamislimo sada da naša aplikacija jako raste. Sada se moramo baviti grahom sa svih različitih mjesta, poput komponenata, različitih struktura paketa i modula koje smo izradili mi i treće strane.

U ovom slučaju, dodavanje svega u kontekst riskira pokretanje sukoba oko toga koji grah treba koristiti. Osim toga, možda ćemo dobiti polako vrijeme pokretanja.

S druge strane, ne želimo napisati @Uvoz za svaku novu komponentu jer je to kontraproduktivno.

Uzmimo za primjer naše životinje. Uistinu bismo mogli sakriti uvoz iz deklaracije konteksta, ali još uvijek se moramo sjetiti znaka @Uvoz za svakoga Config razred.

4.4. Raditi zajedno

Možemo ciljati na najbolje iz oba svijeta. Zamislimo da imamo paket samo za naše životinje. To bi također mogao biti komponenta ili modul i zadržati istu ideju.

Onda možemo jedan @Skeniranje komponenata samo za naše životinja paket:

paket com.baeldung.importannotation.animal; // uvoz ... @Configuration @ComponentScan javna klasa AnimalScanConfiguration {}

I an @Uvoz dozadržite kontrolu nad onim što ćemo dodati kontekstu:

paket com.baeldung.importannotation.zoo; // uvoz ... @Configuration @Import (AnimalScanConfiguration.class) klasa ZooApplication {}

Konačno, svaki novi grah dodan paketu za životinje automatski će se naći u našem kontekstu. I dalje imamo izričit nadzor nad konfiguracijama koje koristimo.

5. Zaključak

U ovom smo brzom vodiču naučili kako se koristi @Uvoz kako bismo organizirali naše konfiguracije.

To smo i naučili @Uvoz je jako slično @Skeniranje komponenata, osim činjenice da @Uvoz ima eksplicitan pristup dok @Skeniranje komponenata koristi implicitni .

Također, razmotrili smo moguće poteškoće s upravljanjem našim konfiguracijama u stvarnim aplikacijama i kako se s njima nositi kombiniranjem obje bilješke.

Kao i obično, cjeloviti kôd dostupan je na GitHubu.


$config[zx-auto] not found$config[zx-overlay] not found