A kivitelező függőségének befecskendezése tavasszal

1. Bemutatkozás

A modern szoftvertervezés vitathatatlanul az egyik legfontosabb fejlesztési elve Függőségi injekció (DI) ami természetesen egy másik kritikusan fontos alapelvből folyik ki: Modularitás.

Ez a cikk egy speciális típusú DI technikát ismertet Konstruktor alapú függőségi injekció tavasszal - ami egyszerűen megfogalmazva azt jelenti, hogy a szükséges alkatrészeket átadják egy osztálynak a példányosítás idején.

A kezdéshez importálnunk kell tavaszi kontextus függőség a mi pom.xml:

 org.springframework tavaszi kontextus 5.2.8.KÖZLEMÉNY 

Akkor fel kell állítanunk a Konfiguráció fájl. Ez a fájl lehet POJO vagy, ha úgy tetszik, XML fájl.

2. Annotation Based Configuration

A Java konfigurációs fájl nagyjából úgy néz ki, mint egy sima Java objektum, néhány további megjegyzéssel:

@Configuration @ComponentScan ("com.baeldung.constructordi") nyilvános osztály Config {@Bean public Engine engine () {return new Engine ("v8", 5); } @Bean nyilvános átvitel továbbítása () {return new Transmission ("csúszó"); }} 

Itt kommentárokkal értesítjük a tavaszi futást, hogy ez az osztály a babdefiníciók szolgáltatója (@Bab annotáció), és hogy további babokat kell kontextusban keresni csomagban com.baeldung.spring. Ezután meghatározzuk a Autó osztály:

@ Component public class Car {@Autowired public car (Motor engine, Transmission transmission) {this.motor = motor; ez.átvitel = átvitel; }}

Tavasz találkozik a mi Autó osztály, miközben csomagellenőrzést végez, és a @Autowired kommentált kivitelező.

A Motor és sebességváltó hívással fogják megszerezni @Bab a. kommentált módszerei Konfig osztály. Végül indítanunk kell az an ApplicationContext a POJO konfigurációnk segítségével:

ApplicationContext context = új AnnotationConfigApplicationContext (Config.class); Autóautó = context.getBean (Autóosztály);

3. Implicit konstruktor injekció

A 4.3 tavasztól az egyetlen konstruktorral rendelkező osztályok kihagyhatják a @Autowired annotáció. Szép kis kényelem és kazánlemez eltávolítás!

Ráadásul a 4.3-tól kezdődően a konstruktor alapú befecskendezés is kihasználható @ Konfiguráció jegyzetekkel ellátott osztályok. És igen, ha egy ilyen osztálynak csak egy konstruktora van, akkor a @Autowired elhagyható az annotáció is.

4. XML alapú konfiguráció

A Spring runtime konfigurálásának másik módja konstruktor alapú függőségi injekcióval egy XML konfigurációs fájl használata:

Vegye figyelembe, hogy konstruktor-arg képes elfogadni egy szó szerinti értéket vagy egy másik babra való hivatkozást, és ezt választható explicitként index és típus biztosítható. típus és index az attribútumok használhatók a kétértelműség feloldására (például ha egy konstruktor több azonos típusú argumentumot vesz fel).

név attribútum használható az xml-java változó-egyeztetéshez is, de akkor a kódod kell hibakereső jelzővel be kell állítani.

Ebben az esetben egy tavaszi alkalmazáskörnyezetet indítóval kell használni ClassPathXmlApplicationContext:

ApplicationContext context = új ClassPathXmlApplicationContext ("baeldung.xml"); Autóautó = context.getBean (Autóosztály);

5. Érvek és ellenérvek

A konstruktor befecskendezésének néhány előnye van a terepi injektáláshoz képest.

Az első előny a tesztelhetőség. Tegyük fel, hogy tesztelni fogunk egy tavaszi babot, amely terepi injekciót használ:

public class UserService {@Autowired private UserRepository userRepository; }

Építése során a UserService például nem tudjuk inicializálni a userRepository állapot. Ennek egyetlen módja a Reflection API, amely teljesen megtöri a kapszulázást. A kapott kód kevésbé biztonságos lesz, mint egy egyszerű konstruktor hívás.

Ezenkívül val velterepi injekcióval, nem hajthatunk végre osztályszintű invariánsokat.Tehát lehetséges, hogy van egy UserService megfelelően inicializált nélkül userRepository. Ezért véletlenszerűt tapasztalhatunk NullPointerExceptions itt-ott. A kivitelező befecskendezésével könnyebb megváltoztathatatlan alkatrészeket építeni.

Ráadásul, A konstruktorok használata objektumpéldányok létrehozásához az OOP szempontjából természetesebb.

Másrészt a konstruktor injektálásának fő hátránya a bőbeszédűsége, különösen akkor, ha a babnak maréknyi függősége van. Néha álruhában áldás lehet, mivel erősebben megpróbálhatjuk a függőségek számát minimális szinten tartani.

6. Következtetés

Ez a gyors bemutató két különféle felhasználási mód alapjait mutatta be Konstruktor alapú függőségi injekció a tavaszi keret használatával.

A teljes végrehajtása az oktatóanyag a GitHub oldalon található.