Charakteristickou vlastností rámce
Spring™ je snaha o zjednodušení práce s
některými běžně používanými, ale poměrně složitými rozhraními nižší
úrovně. Spring™ pro taková rozhraní poskytuje
abstrakční vrstvu, která tvoří rozhraní vyšší úrovně a která usnadňuje
programátorům práci v dané oblasti. Klasickým příkladem je abstrakční
vrstva nad JDBC, která bude popsána v jedné z
navazujících diplomových prací, ale stejný princip
Spring™ uplatňuje i pro externí
datové zdroje (resources). Externími datovými zdroji jsou myšleny
všechny možné vstupní zdroje objektů třídy
java.io.InputStream, tzn. soubory, zdroje
dosažitelné prostřednictvím URL apod. Centrálním
prvkem celé této abstrakční vrstvy je rozhraní
org.springframework.core.io.Resource, které
umožňuje jednotnou práci s externími zdroji všech typů. Výčet klíčových
implementujících tříd ze stejného balíku může napomoci v pochopení, oč
jde:
org.springframework.core.io.ClassPathResource
- reprezentuje externí zdroj umístěný v
classpath,
org.springframework.core.io.FileSystemResource
- reprezentuje soubor nebo adresář v souborovém
systému,
org.springframework.web.context.support.ServletContextResource
- reprezentuje externí zdroj dostupný příslušné webové
aplikaci,
org.springframework.core.io.UrlResource
- reprezentuje externí zdroj dostupný prostřednictvím
URL.
Prostřednictvím rozhraní
Resource lze jednotným způsobem přistupovat k
objektu typu java.io.InputStream prostřednictvím
metody getInputStream() tohoto rozhraní. Velmi
silnou vlastností této abstrakční vrstvy je také možnost získání
příslušného externího zdroje pouze na základě zadané
cesty (path). Tato cesta obsahuje volitelný prefix
a samotnou cestu k externímu zdroji. Cesta může mít jeden z
následujících tvarů:
začíná jedním z klasických URL prefixů
podporovaných danou JVM (např. http:, ftp:, file:) - v takovém
případě je interními mechanismy rámce vytvořen objekt typu
UrlResource.
začíná specifickým prefixem rámce
Spring™
classpath: - vytvořen je objekt typu
ClassPathResource.
není-li uveden žádný prefix, cesta je relativní a je interpretována na základě typu aplikačního kontextu, který je pro přístup ke zdroji použit.
Jde-li o kontext typu
org.springframework.context.support.ClasspathXmlApplicationContext,
pak relativní cesta je interpretována vzhledem k aktuální
classpath a je vytvořen
ClassPathResource.
Jde-li o kontext typu
org.springframework.context.support.FileSystemXmlApplicationContext,
pak relativní cesta je interpretována vzhledem k aktuálnímu
pracovnímu adresáři a je vytvořen
FileSystemResource.
Jde-li o kontext typu
org.springframework.web.context.support.XmlWebApplicationContext,
pak relativní cesta je interpretována vzhledem ke kořeni
webové aplikace a je vytvořen
ServletContextResource.
Máme-li tedy objekt context typu
ApplicationContext, pak můžeme k externím zdrojům
přistupovat pomocí cesty takto:
Resource classPathResource = context.getResource("classpath:conf.xml");
Resource urlResource = context.getResource("file:/cesta/k/souboru/conf.xml");
Resource contextSpecificResource = context.getResource("relativni/cesta/conf.xml");
Tentýž
mechanismus lze díky v aplikačním kontextu implicitně registrovanému
editoru vlastností
org.springframework.core.io.ResourceEditor s
výhodou využít v XML konfiguračním souboru kontextu.
Máme-li například třídu
class NejakyBean {
private Resource configFile;
public void setResource(Resource configFile) {
this.configFile = configFile;
}
}
pak inicializaci vlastnosti configFile
můžeme provést následující XML konfigurací:
<bean id="nejakyBean" class="....NejakyBean"> <property name="configFile" value="WEB-INF/config.xml" /> </bean>
Jde-li o webový aplikační kontext, pak atribut
configFile bude reprezentovat soubor
config.xml umístěný v podsložce
WEB-INF webové aplikace.
Abstrakce externích datových zdrojů je samozřejmě intenzivně využívána v celém rámci Spring a popsané principy lze využít i při vytváření aplikačního kontextu. Následujícího příkladu využijeme i k předvedení, jakým způsobem lze vytvořit aplikační kontext načtením více konfiguračních souborů najednou:
ApplicationContext context =
new org.springframework.context.support.FileSystemXmlApplicationContext(
new String[]{"file:/d:/ctx1.xml","classpath:ctx2.xml"});
Užitečnou
specialitou při vytváření aplikačního kontextu (ale nikde jinde) je
možnost specifikace množiny externích datových zdrojů pomocí jediné
cesty. Lze k tomu využít jednak speciální prefix
claspath*: a jednak zástupný znak
* použitý v druhé části cesty. Jejich význam si
vysvětlíme na následujícím příkladu:
ApplicationContext context =
new FileSystemXmlApplicationContext("classpath*:ctx-*.xml"});
V tomto případě bude aplikační kontext vytvořen na základě všech XML souborů, které se nacházejí v classpath a jejichž název začíná řetězcem ctx- .
Aplikaci této abstrakční vrstvy lze nalézt v souboru
WEB-INF/web.xml přiložené vzorové aplikace, kde je
použita pro deklaraci množiny konfiguračních XML
souborů vytvářeného aplikačního kontextu.