Set 14

Inversion of Control e Spring

Tag: javaGiampiero Granatella @ 08:03

Sento tanto parlare di Spring e tanti miei amici, che stimo informaticamente, del JUG lo usano, che mi sono deciso ad approcciarmi a questo framework, anche se da una prima vista, qualche tempo fa, non mi aveva particolarmente colpito.

Alla base di tutto Spring c’è questo concetto dell’Inversion of Control al quale dedico questo post. Benché usatissimo, cosa vuol dire esattamente?

Da quanto comprendo è invertire il punto di vista dell’approccio nello sviluppo di un’applicazione. Cercare di sviluppare in maniera generica (via interfaccia) e isolare in un punto specifico il flusso di controllo (control flow), dove in maniera imperativa vengono specificate le singole procedure o le singole classi che attuano il problema generico ad un singolo contesto.

Quali dovrebbero essere i vantaggi del IoC?

  1. La semplicità nello sviluppo
  2. maggiore lettura del codice
  3. e il più importante di tutto il riuso

Molti affermano che Spring come altri framework, usando IoC vincolano i programmatori alla buona programmazione andando ad utilizzare tutte le potenzialità dell’Object Oriented (eredità e Polimorfismo, …), che altrimenti vengono spesso ignorati portando i linguaggi OO ad essere estrnsioni dei procedurali. Se da un lato mi trovo d’accordo non sono ancora così esperto da dire se l’introduzione di tali framework risolve un problema, ma ne introduce nuovi pradigmi di cattiva programmazione… vedremo.

Ma per i più curiosi a cosa si riporta Spring e gli altri framework che realizzano l’IoC. Toriniamo qualche passo indietro e scopriamo che alla base c’è una soluzione (un Design Pattern) che realizza questi concetti: l’Abstract Factory (già descritto nei design Pattern della GoF).

Facciamo l’HelloWorld dell’Inversion of Control…

Primo scriviamo un interfaccia per i saluti (SalutiIF.java)

pulic interface SalutiIF {
   public void salutami (String name);
}
Questa interfaccia ci dice solamente che per fare i saluti una classe concreta deve avere il metodo salutami. Come verranno effettuati questi saluti (su schermo, come webservice, un EJB Session) non mi interessa avrò classi concrete che se ne occuperanno e un modo di definire il flusso che collegherà le classi concrete all’opportuna interfaccia.
La classe concreta per stampare su video sarà SalutiStdOut.java
public class SalutiStdOut implements SalutiIF {
    public void salutami (String name) {
    System.out.println("Ciao "+name);
    }
}

e ora immaginiamo di esserci scritti SalutiWS, SalutiEJB, SalutiSocket, SalutiServlet ecc…

Dove definire le nostre injection (in questo caso il flusso si riduce a dire quale implementazione usare). In spring in un bel (ironico) file XML. Ma in questo caso basta un file di properties. Il factory userà il file di properties e istanzierà la classe concreta (è proprio il punto dove si realizza il Flow Control).

Nel client che chiederà i saluti  non istanzieremo la classe SalutiStdOut, ma ci verrà ritornata attraverso il factory. Il factory sarà un singleton che al suo interno avrà un metodo salutiFactory simile al seguente…

public SalutiIF getSaluti {
 try {
   Properties prop = new Properties();
   prop.load (new FileInputStream ("/ioctest.properties");
   return (SalutiIF) Class.forname(prop.getProperty("saluti")).newInstance();
 }
}

Ho scritto il codice direttamente nel post, quindi magari ci ho messo qualche errore :-), ma credo che con questo esempio mi sia più chiaro e spero anche a voi il concetto di IoC che è  alla base di Spring. E da questo si può passare oltre nello studio…

3 Responses to “Inversion of Control e Spring”

  1. Deckard says:

    Ciao,

    volevo segnalarti un piccolo errorino dovuto certamente ad una svista avendo, come tu stesso hai specificato, scritto il codice direttamente nel posto eheheh: quando dichiari la classe concreta, dovresti specificare che estende l’interfaccia, per cui:

    public class SalutiStdOut implements {interfaccia} {

    Per il resto, ottimo post!

  2. Giampiero Granatella says:

    Corretto. Grazie per la segnalazione…
    E’ per questo che solitamente prima li provo su IntelliJ, di mio metto sempre un sacco di errori.

    Grazie ancora
    Giampiero

  3. Weblog di Paolo Predonzani » Blog Archive » Dependency Injection: belle parole o fatti? says:

    [...] tutti fanno di tutto. Qui ho schematizzato un po’). Il mio amico Giampiero ha mostrato che può bastare un po’ di reflection. Ma anche se scrivete un bel main() che in modo pulito si occupa di istanziare (senza reflection) e [...]

Leave a Reply