Mi az a tavaszi bab?

1. Áttekintés

A bab a tavaszi keret egyik kulcsfogalma. Mint ilyen, ennek a fogalomnak a megértése elengedhetetlen a keretrendszer megértéséhez és hatékony felhasználásához.

Sajnálatos módon, nincs egyszerű válasz egy egyszerű kérdésre - mi is az a tavaszi bab valójában. Egyes magyarázatok olyan alacsony szintre esnek, hogy nagy kép hiányzik, míg mások túl homályosak.

Ez az oktatóanyag megpróbálja megvilágítani a témát, kezdve a hivatalos dokumentációban található leírással.

2. Babdefiníció

Íme a bab meghatározása a Spring Framework dokumentációban:

Tavasszal az objektumokat, amelyek az alkalmazás gerincét alkotják, és amelyeket a tavaszi IoC tároló kezel, babnak nevezzük. A bab olyan objektum, amelyet egy Spring IoC tároló példányosít, állít össze és más módon kezel.

Ez a meghatározás tömör és a lényegre tér, de hiányzik egy fontos dolog - a tavaszi IoC konténer. Menjünk le a nyúl lyukán, hogy megnézzük, mi ez és milyen előnyökkel jár.

3. A kontroll inverziója

Egyszerűen fogalmazva: az Inversion of Control vagy röviden az IoC egy folyamat, amelyben egy objektum meghatározza függőségeit anélkül, hogy létrehozná azokat. Ez az objektum delegálja az ilyen függőségek létrehozásának feladatát egy IoC-tárolóra.

Kezdjük néhány domain osztály deklarálásával, mielőtt belevágnánk az IoC-be.

3.1. Domain osztályok

Tegyük fel, hogy van osztálydeklarációnk:

public class Company {privát cím címe; nyilvános vállalat (címcím) {this.cím = cím; } // getter, setter és egyéb tulajdonságok}

Ehhez az osztályhoz egy típusú munkatársra van szükség Cím:

nyilvános osztály Cím {magán String utca; privát int szám; public Address (String utca, int szám) {this.street = utca; ez.szám = szám; } // szerelők és beállítók}

3.2. Hagyományos megközelítés

Normál esetben objektumokat az osztályuk konstruktoraival hozunk létre:

Cím címe = új cím ("High Street", 1000); Társaság = új Társaság (cím);

Nincs ezzel a megközelítéssel semmi baj, de nem lenne jó a függőségek jobb kezelése?

Képzeljen el egy alkalmazást, amely több tucat vagy akár több száz osztályt tartalmaz. Néha egy osztály egyetlen példányát szeretnénk megosztani az egész alkalmazásban, máskor külön objektumra van szükségünk minden egyes felhasználási esethez stb.

Ilyen számú tárgy kezelése nem más, mint egy rémálom. Itt jön a megtérés a vezérlés inverziójába.

Az objektum ahelyett, hogy saját maga készítené a függőségeket, lekérheti függőségeit egy IoC-tárolóból. Mindössze annyit kell tennünk, hogy megadjuk a tárolónak a megfelelő konfigurációs metaadatokat.

3.3. Babkonfiguráció

Először is, díszítsük a Vállalat osztály a @Összetevő kommentár:

@ Component public class Company {// ez a test ugyanaz, mint korábban}

Íme egy konfigurációs osztály, amely bab metaadatokat szolgáltat egy IoC-tárolóhoz:

@Configuration @ComponentScan (basePackageClasses = Company.class) public class Config {@Bean public Address getAddress () {return new Address ("High Street", 1000); }}

A konfigurációs osztály egy típusú babot eredményez Cím. Azt is hordozza @ComponentScan megjegyzés, amely utasítja a tartályt, hogy keressen babot a Vállalat osztály.

Amikor egy Spring IoC tároló ilyen típusú objektumokat készít, akkor az összes objektumot Spring babnak hívják, mivel az IoC tároló kezeli őket.

3.4. IoC működésben

Mivel a babot egy konfigurációs osztályban definiáltuk, szükségünk lesz a AnnotationConfigApplicationContext osztály egy konténer felépítéséhez:

ApplicationContext context = új AnnotationConfigApplicationContext (Config.class);

Egy gyors teszt ellenőrzi babunk létezését és tulajdonságait:

Vállalati vállalat = context.getBean ("vállalat", Vállalat.osztály); assertEquals ("High Street", company.getAddress (). getStreet ()); assertEquals (1000, company.getAddress (). getNumber ());

Az eredmény azt bizonyítja, hogy az IoC-tároló helyesen hozta létre és inicializálta a babokat.

4. Következtetés

Ez az oktatóanyag rövid leírást adott a tavaszi babról és azok kapcsolatáról az IoC konténerrel.

Az oktatóanyag teljes forráskódja megtalálható a GitHub oldalon.


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