Perché questo codice crea oggetto come interfaccia?

2

In lettura Spring in Action (3a edizione) e qui un frammento da esso:

ApplicationContext ctx=new ClassPathXmlApplicationContext("springidol.xml");
            Performer performer=(Performer)ctx.getBean("poeticDuke");
            performer.perform();

Non ha alcun problema, tuttavia, quando l'autore introduce il metodo init e il metodo destroy:

<bean id="poeticDuke"
        class="com.springinaction.springidol.PoeticJuggler"
        init-method="turnOnLights"
        destroy-method="turnOffLights">

In qualche modo l'output ha ottenuto solo il metodo init ma non il metodo destroy. Poi ho capito che il contesto chiama destroy-method alla sua chiusura e ho provato a codificare come segue:

    ApplicationContext ctx=new ClassPathXmlApplicationContext("springidol.xml");
                Performer performer=(Performer)ctx.getBean("poeticDuke");
                performer.perform();
ctx.close();

Non viene compilato perché l'interfaccia ApplicationContext non ha il metodo close. Funziona solo come segue:

ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("springidol.xml");
                Performer performer=(Performer)ctx.getBean("poeticDuke");
                performer.perform();
ctx.close();

Perché l'autore l'ha scritto in questo modo?

    
posta lamwaiman1988 14.08.2012 - 10:17
fonte

1 risposta

2

I metodi init e destroy sono chiamati dal contenitore dell'applicazione Spring. Il codice dell'applicazione non dovrebbe mai chiamarli e poiché l'interfaccia ApplicationContext è pensata per essere utilizzata dalle applicazioni, non contiene il metodo.

Questo è il punto centrale di framework come Spring: "non chiamarci, ti chiameremo".

Tieni presente che il metodo close() è incluso nell'interfaccia ConfigurableApplicationContext , che è l'API per il contenitore dell'applicazione da chiamare.

    
risposta data 14.08.2012 - 10:52
fonte

Leggi altre domande sui tag