di: Federico Tomassetti 23 Novembre 2009
Google Guice è una libreria Java realizzata e utilizzata a lungo su progetti interni dal gigante di Mountain View, poi rilasciata con licenza Apache. Si tratta di un container alla stregua di Spring che sfrutta appieno le caratteristiche introdotte di Java 1.5 come le annotation, per associare dati di configurazione direttamente a porzioni di codice, invece che ricorrere a lunghi file XML e i generics per gestire i tipi in maniera flessibile.
L'obiettivo di questo articolo è fornire una panoramica introduttiva sulle funzioni principali fra quelle fornite da Guice: quelle di Dependency Injection, dove si propone come alternativa snella a librerie come Spring.
Per osservare l'utilizzo della Dependency Injection ci serviamo di un esempio molto semplice. Immaginiamo di dover realizzare un sistema di controllo che periodicamente legga il valore di un sensore e provveda a utilizzare un servizio di logging per memorizzarlo. Il valore inoltre sarà confrontato con una soglia e se superiore a questa si dovrà inoltrare un allarme per segnalare l'evento.
Per favorire il riutilizzo di un sistema di questo tipo possiamo renderlo indipendente dal sistema di logging e dalla modalità di segnalazione dell'allarme ottenendo così un sistema flessibile in grado di adattarsi a diverse configurazioni. Come? Ricorrendo alle interfacce: nel codice allegato troverete Logging e AlertDispatcher. La nostra classe SensorGuard coordina delle istanze di queste interfacce per portare a termine il suo compito:
public class SensorGuard {
private Logging logging;
private AlertDispatcher alertDispatcher;
private Timer timer = null;
@Inject
public SensorGuard(Logging logging, AlertDispatcher alertDispatcher) {
this.logging = logging;
this.alertDispatcher = alertDispatcher;
}
public void start(Sensor sensor, int threshold, int intervalInSeconds) {
if (this.timer != null) {
throw new IllegalStateException("Sensor guard already started!");
}
this.timer = new Timer();
this.timer.schedule(new GuardTask(sensor, threshold), intervalInSeconds*1000, intervalInSeconds*1000);
}
public void stop() {
if (this.timer == null) {
throw new IllegalStateException("Sensor guard not started!");
}
this.timer.cancel();
this.timer = null;
}
private class GuardTask extends TimerTask {
private int threshold;
private Sensor sensor;
public GuardTask(Sensor sensor, int threshold) {
this.sensor = sensor;
this.threshold = threshold;
}
public void run() {
int value = sensor.readValue();
if (value > threshold) {
logging.error("Sensor "+sensor.getName()+" returned the value "+value+"! It is above the threshold!");
alertDispatcher.sendAlert(sensor, value, threshold, new Date());
} else {
logging.info("Sensor "+sensor.getName()+" returned the value "+value);
}
}
}
}
Nel codice in allegato ci sono anche le implementazioni delle interfacce di supporto utili per provare a testare la nostra classe SensorGuard. Vediamo come utilizzarle per realizzare una piccola applicazione. Senza utilizzare Google Guice possiamo scrivere codice come questo:
public static void main(String[] args) {
SensorGuard sg = new SensorGuard(new ConsoleLogging(), new DummyAlertDispatcher());
sg.start(new DummySensor(), 88,1);
try {
Thread.sleep(10000);
System.out.println("STOP!!!");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
sg.stop();
}
}
|
AppFuse: realizzare un'applicazione completa (implementare i servizi) |
Guida Apache StrutsIl primo e più utilizzato tra i framework MVC del mondo Java,... |
Guida Java SpringScoprire il lightweight container più famoso del mondo Java.... |
Guida Java 6Prendendo le mosse dalla guida Java, già presente su HTML.it,... |
Ogni mese, direttamente nella tua e-mail: articoli, script e guide su Java, Visual Basic, VB.Net ed i più diffusi linguaggi di programmazione.
Iscriviti alla newsletter
|
|
Corso Google AdWords Base25 Giugno 2012 a Milano |
|
|
Corso Google AdWords Base05 Giugno 2012 a Roma |