Přehled
V tomto článku, budeme zavádět pojmy IoC (Inversion of Control) a DI (Dependency Injection), a budeme pak se podívejte na to, jak tyto jsou implementovány v Spring framework.,
Další čtení:
Elektroinstalace v Jarní: @Autowired, @Resource a @Inject
@Component vs @ Repository and @ Service in Spring
co je inverze kontroly?,
Inverze řízení je princip v softwarovém inženýrství, kterým je řízení objektů nebo částí programu přeneseno do kontejneru nebo rámce. Nejčastěji se používá v kontextu objektově orientovaného programování.
na rozdíl Od tradičních programování, ve kterém náš vlastní kód umožňuje volání do knihovny, Mov umožňuje rámec, aby se řízení toku programu a volání na náš vlastní kód. Chcete-li to povolit, rámce používají abstrakce s vestavěným dalším chováním., Pokud chceme přidat své vlastní chování, musíme rozšířit třídy rámce nebo zapojit vlastní třídy.,
výhody této architektury jsou:
- oddělení realizace úkolu z jeho realizace
- usnadňuje přepínání mezi různými implementacemi
- větší modularita programu
- větší lehkostí při testování programu izolovat součást, nebo zesměšňovat jeho závislosti a umožňuje součásti komunikovat prostřednictvím smluv
Inverze Kontroly může být dosaženo prostřednictvím různých mechanismů, jako jsou: Strategie návrhového vzoru Service Locator vzor, Tovární vzor, a Dependency Injection (DI).,
podíváme se na DI next.
co je injekce závislosti?
Dependency injection je vzor, pomocí kterého lze implementovat IoC, kde je invertované ovládání nastavením závislostí objektu.
akt připojení objektů s jinými objekty, nebo „vstřikování“ objektů do jiných objektů, provádí assembler spíše než samotné předměty.,
Zde je, jak by vytvořit objekt závislost v tradiční programování:
public class Store { private Item item; public Store() { item = new ItemImpl1(); }}
V příkladu výše, musíme vytvořit instanci implementace Položka rozhraní v Obchodě třída sama o sobě.
pomocí DI, můžeme přepsat příklad bez uvedení provádění Položky, které chceme:
public class Store { private Item item; public Store(Item item) { this.item = item; }}
V další části, uvidíme, jak můžeme poskytnout plnění Položky prostřednictvím metadat.,
IoC i DI jsou jednoduché koncepty, ale mají hluboké důsledky ve způsobu, jakým strukturujeme naše systémy, takže stojí za to dobře porozumět.
kontejner pružiny IoC
kontejner MOV je běžnou charakteristikou rámců, které implementují MOV.
v rámci pružiny je kontejner MOV reprezentován aplikací interface ApplicationContext. Jarní kontejner je zodpovědný za instalaci, konfiguraci a montáž objektů známých jako fazole, stejně jako správu jejich životního cyklu.,
Spring framework poskytuje několik implementací ApplicationContext rozhraní — ClassPathXmlApplicationContext a FileSystemXmlApplicationContext pro samostatné aplikace, a WebApplicationContext pro webové aplikace.
aby bylo možné sestavit fazole, kontejner používá konfigurační metadata, která mohou být ve formě konfigurace XML nebo anotací.
zde je jeden způsob, jak ručně vytvořit kontejner:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
pro nastavení atributu položky ve výše uvedeném příkladu můžeme použít metadata., Poté kontejner přečte tato metadata a použije je k sestavení fazolí za běhu.
injekce závislosti na jaře lze provést pomocí konstruktorů, setrů nebo polí.
Constructor-Based Dependency Injection
v případě vstřikování závislosti na konstruktoru vyvolá kontejner Konstruktor s argumenty, z nichž každý představuje závislost, kterou chceme nastavit.
Spring řeší každý argument primárně podle typu, následuje název atributu a index pro disambiguaci., Podívejme se na konfiguraci fazole a její závislosti pomocí anotací:
anotace @konfigurace naznačuje, že třída je zdrojem definic fazole. Také jej můžeme přidat do více tříd konfigurace.
anotace @Bean se používá při metodě definování fazole. Pokud nezadáme vlastní jméno, název fazole bude výchozí pro název metody.
pro fazole s výchozím rozsahem singleton, Spring nejprve zkontroluje, zda již existuje instance fazole v mezipaměti a vytvoří pouze novou, pokud tomu tak není., Pokud používáme rozsah prototypu, kontejner vrátí novou instanci bean pro každé volání metody.
Další způsob, jak vytvořit konfiguraci fazole je prostřednictvím XML konfigurace:
Setr-Založené Dependency Injection
Pro setra na bázi DI kontejneru bude volat setter metody z naší třídy, po vyvolání ne-argument konstruktoru nebo ne-argument statickou tovární metodu na instanci bean., Pojďme vytvořit tato konfigurace pomocí anotací:
@Beanpublic Store store() { Store store = new Store(); store.setItem(item1()); return store;}
můžeme také použít XML pro stejnou konfiguraci fazole:
<bean class="org.baeldung.store.Store"> <property name="item" ref="item1" /></bean>
Konstruktér-based a setr-založené typy injekce mohou být kombinovány na stejném bean. Pružinová dokumentace doporučuje použití vstřikování na bázi konstruktoru pro povinné závislosti a vstřikování na bázi setru pro volitelné.
7., Terénní Dependency Injection
V případě, že Pole Založené na DI, můžeme inject závislostí jejich označením s @Autowired anotace:
public class Store { @Autowired private Item item; }
Při konstrukci Uložení objektu, pokud není konstruktor nebo setter metodu inject Položky bean, kontejner bude používat odraz vnést Položku do Obchodu.
toho můžeme dosáhnout také pomocí konfigurace XML.,
Tento přístup může vypadat jednodušší a čistší, ale je nedoporučuje používat, protože to má několik nevýhod jako například:
- Tato metoda využívá odrazu na injekci závislostí, která je nákladnější než konstruktor nebo setter založené na injekci
- je To opravdu snadné držet přidání více závislostí pomocí tohoto přístupu. Pokud jste použili injekci konstruktoru s více argumenty, mohli bychom si myslet, že třída dělá více než jednu věc, která může porušit zásadu jednotné odpovědnosti.,
Více informací o @ Autowired anotaci naleznete v článku zapojení na jaře.
Autowiring závislosti
zapojení umožňuje pružinové nádobě automaticky vyřešit závislosti mezi spolupracujícími fazolemi kontrolou definovaných fazolí.,
k Dispozici jsou čtyři režimy autowiring fazole pomocí XML konfigurace:
- ne: výchozí hodnota – to znamená, že žádné autowiring se používá pro fazole a musíme explicitně název závislostí
- podle názvu: autowiring je založeno na název vlastnosti, proto na Jaře bude hledat bean s stejný název jako vlastnost, která je třeba nastavit
- byType: podobné podle názvu autowiring, pouze na základě typu nemovitosti. To znamená, že jaro bude hledat fazole se stejným typem nemovitosti, kterou chcete nastavit., Pokud existuje více než jedna fazole tohoto typu, rámec hodí výjimku.,můžete také aplikovat fazole pomocí @Autowired anotace pro autowiring podle typu:
public class Store { @Autowired private Item item;}
Pokud existuje více než jeden bean stejného typu, můžeme použít @Qualifier poznámky k referenční fazole jméno:
public class Store { @Autowired @Qualifier("item1") private Item item;}
Nyní, pojďme autowire fazole podle typu přes XML konfiguraci:
<bean class="org.baeldung.store.Store" autowire="byType"> </bean>
Next, pojďme aplikovat bean pojmenované položky do položky majetku obchodě bean podle názvu přes XML:
<bean class="org.baeldung.store.ItemImpl1" /><bean class="org.baeldung.store.Store" autowire="byName"></bean>
můžeme to také přepsat autowiring definováním závislostí explicitně prostřednictvím konstruktoru argumenty, nebo tvůrci.,
Lazy Inicializaci Fazole
ve výchozím nastavení, kontejner, vytváří a konfiguruje všechny singleton beans během inicializace. Aby se tomu zabránilo, můžete použít lazy-init atribut s hodnotou true na bean konfigurace:
<bean class="org.baeldung.store.ItemImpl1" lazy-init="true" />
v důsledku toho, položka1 bean bude inicializován pouze tehdy, když je požádáno nejdříve, a ne při startu., Výhodou je rychlejší inicializace čas, ale trade-off je, že konfigurační chyby mohou být objeveny pouze po bean je požadováno, což může být několik hodin nebo dokonce dnů po aplikaci již běží.
Závěr
V tomto článku jsme představili pojmy inversion of control a dependency injection a názorně jim v Spring framework.
Více o těchto pojmech si můžete přečíst v článcích Martina Fowlera:
- Inverze kontrolních kontejnerů a vzor vstřikování závislosti.,
- Inverze kontroly