Spring parte3

20 Maggio 2011

Vediamo alcune funzionalità avanzate di Spring che l’hanno reso un prodotto di successo.

Le Factory in Spring supportano due modalità di instanziazione dei Bean:

  • Singleton
  • Prototype

Nell modalità Singleton,cioè il comportamento di default, ogni invocazione del metodo getBean(“nomelogico”) restituisce un singleton per quell’oggetto. Avremo quindi un oggetto vero e proprio, accessibile solo da un cliente per volta.

Se più clienti hanno interesse ad un certo servizio, è possibile settare la proprietà Prototype, tramite la quale è possibile ottenere ad ogni invocazione di getBean, una nuova instanza del Bean.

La differenza col modello di EJB nella gestione del pool di instanze, è che in Spring il framework non effettua le callback per l’assegnazione di istanze libere del pool, non gestisce la concorrenza delle chiamate, non mantiene la Sessione, non effettua la Passivazione/Attivazione delle istanze: si limita ad assegnare un’istanza al chiamante, perchè Spring è concepito come modello a container leggero. Per avere tutte queste funzionalità però,il core-developer, può estendere il comportamento di una Factory minimale, DefaultListableBeanFactory, e avere un container che agisce con le caratteristiche scelte.

Un’alternativa all’uso della Factory è usare un ApplicationContext. Tale oggetto di sistema, ci consente di avere funzionalità come gestione del ciclo di vita e delle transazioni, inoltre ci permette di gestire eventi, implementando il classico Observer Pattern, che comunque necessita di un livello di indirettezza, per registrare gli eventi. Perchè un Bean venga agganciato ad un ApplicationContext per potervi interagire, è necessario che esso implementi l’interfaccia ApplicationContextAware che ci impone di settare un riferimento all’ApplicationContext.


public class EmailBean implements ApplicationContextAware {
private List blackList;
public void setBlackList(List blackList) {
this.blackList = blackList;
}
public void setApplicationContext(ApplicationContext ctx) {
this.ctx = ctx;
}

public void sendEmail(String address, String text) {
if (blackList.contains(address)) {
BlackListEvent evt = new BlackListEvent(address, text);
ctx.publishEvent(evt);
return;
}
}
}

Leggi il seguito di questo post »