Considerato il cuore di Spring, lo IoC Container fornisce un contesto altamente configurabile per la creazione e risoluzione delle dipendenze di componenti che qui vengono chiamati bean (da non confondere con i JavaBean).
A differenza di quanto avviene nei cosiddetti "heavyweight container" dove i componenti gestiti devono rispecchiare caratteristiche particolari o implementare opportune classi astratte fornite dal framework,
in Spring un bean non deve aderire a nessun tipo di contratto e può essere rappresentato da una qualunque classe Java.
Tecnicamente parlando, lo IoC Container è realizzato da due interfacce:
- BeanFactory, che definisce le funzionalità di base per la gestione dei bean
- ApplicationContext, che estende queste funzionalità basilari aggiungendone altre tipicamente enterprise come ad esempio la gestione degli eventi, l'internazionalizzazione e l'integrazione con AOP
Di seguito analizzeremo le funzionalità di base fornite dallo IoC Container fornite da BeanFactory
, tenendo presente che tutto ciò che verrà detto è valido anche per ApplicationContext
.
L'interfaccia BeanFactory
rappresenta la forma più semplice di IoC Container in Spring e ha il compito di:
- creare i bean necessari all'applicazione
- inizializzare le loro dipendenze attraverso l'utilizzo dell'injection
- gestirne l'intero ciclo di vita
Per svolgere questi compiti, il container si appoggia a configurazioni impostate dall'utente che, riflettendo lo scenario applicativo, specificano i bean che dovranno essere gestiti dal container, le dipendenze che intercorrono tra questi oltre alle varie configurazioni specifiche.
XmlBeanFactory
In Spring esistono diverse implementazioni di BeanFactory
, la più comune delle quali è senza dubbio la XmlBeanFactory
che permette di utilizzare uno o più file XML per descrivere la configurazione da utilizzare. I file di configurazione della XmlBeanFactory
hanno la seguente forma:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="..." class="...">
<!-- eventuali risoluzioni di dipendenze e proprietà -->
</bean>
<bean id="..." class="...">
<!-- eventuali dipendenze e proprietà -->
</bean>
<!-- altri bean applicativi -->
Dopo l'intestazione del file XML, racchiuse tra i tag <beans>, troviamo le definizioni dei bean e, per ognuno di questi, le eventuali proprietà che ne descriveranno la struttura e il comportamento. Osserviamone alcune:
- l'Id associato al bean per essere richiamato tramite invocazioni al container
- Il
nome della classe
che implementa il bean in caso questa venga istanziata direttamente o della relativa factory che si occuperà della sua creazione Risoluzione di dipendenze
attraverso metodi setter o costruttori appositi- Proprietà comportamentali che definiscono come il bean deve essere trattato dal container (scope, ciclo di vita, etc.)