Primavera - Ciclo di vita dei fagioli

Il ciclo di vita di un fagiolo primaverile è facile da capire. Quando viene creata un'istanza di un bean, potrebbe essere necessario eseguire alcune inizializzazioni per portarlo in uno stato utilizzabile. Allo stesso modo, quando il fagiolo non è più necessario e viene rimosso dal contenitore, potrebbe essere necessaria una pulizia.

Sebbene ci siano elenchi delle attività che si svolgono dietro le quinte tra il momento dell'istanziazione del bean e la sua distruzione, questo capitolo discuterà solo due importanti metodi di callback del ciclo di vita del bean, che sono richiesti al momento dell'inizializzazione del bean e della sua distruzione.

Per definire il setup e lo smontaggio di un bean, dichiariamo semplicemente <bean> con initmethod e / o destroy-methodparametri. L'attributo init-method specifica un metodo che deve essere chiamato sul bean immediatamente dopo l'istanza. Allo stesso modo, destroymethod specifica un metodo che viene chiamato appena prima che un bean venga rimosso dal contenitore.

Callback di inizializzazione

L'interfaccia org.springframework.beans.factory.InitializingBean specifica un unico metodo:

void afterPropertiesSet() throws Exception;

Pertanto, puoi semplicemente implementare l'interfaccia sopra e il lavoro di inizializzazione può essere fatto all'interno del metodo afterPropertiesSet () come segue:

public class ExampleBean implements InitializingBean {
   public void afterPropertiesSet() {
      // do some initialization work
   }
}

Nel caso di metadati di configurazione basati su XML, è possibile utilizzare l'estensione init-methodattributo per specificare il nome del metodo che ha una firma void senza argomenti. Ad esempio:

<bean id = "exampleBean" class = "examples.ExampleBean" init-method = "init"/>

Di seguito è riportata la definizione della classe:

public class ExampleBean {
   public void init() {
      // do some initialization work
   }
}

Richiami di distruzione

L' interfaccia org.springframework.beans.factory.DisposableBean specifica un unico metodo:

void destroy() throws Exception;

Quindi, puoi semplicemente implementare l'interfaccia sopra e il lavoro di finalizzazione può essere fatto all'interno del metodo destroy () come segue:

public class ExampleBean implements DisposableBean {
   public void destroy() {
      // do some destruction work
   }
}

Nel caso di metadati di configurazione basati su XML, è possibile utilizzare l'estensione destroy-methodattributo per specificare il nome del metodo che ha una firma void senza argomenti. Ad esempio:

<bean id = "exampleBean" class = "examples.ExampleBean" destroy-method = "destroy"/>

Di seguito è riportata la definizione della classe:

public class ExampleBean {
   public void destroy() {
      // do some destruction work
   }
}

Se utilizzi il contenitore IoC di Spring in un ambiente di applicazione non Web; ad esempio, in un ambiente desktop rich client, si registra un hook di arresto con JVM. In questo modo si garantisce un arresto regolare e si richiamano i metodi di distruzione pertinenti sui bean singleton in modo che tutte le risorse vengano rilasciate.

Si consiglia di non utilizzare i callback InitializingBean o DisposableBean, poiché la configurazione XML offre molta flessibilità in termini di denominazione del metodo.

Esempio

Cerchiamo di avere un IDE Eclipse funzionante e di eseguire i seguenti passaggi per creare un'applicazione Spring:

Passi Descrizione
1 Crea un progetto con un nome SpringExample e crea un pacchetto com.tutorialspoint sottosrc cartella nel progetto creato.
2 Aggiungere le librerie Spring richieste utilizzando l' opzione Aggiungi JAR esterni come spiegato nel capitolo Esempio Spring Hello World .
3 Crea classi Java HelloWorld e MainApp nel pacchetto com.tutorialspoint .
4 Crea il file di configurazione Beans Beans.xml sottosrc cartella.
5 Il passaggio finale consiste nel creare il contenuto di tutti i file Java e nel file di configurazione Bean ed eseguire l'applicazione come spiegato di seguito.

Ecco il contenuto di HelloWorld.java file -

package com.tutorialspoint;

public class HelloWorld {
   private String message;

   public void setMessage(String message){
      this.message = message;
   }
   public void getMessage(){
      System.out.println("Your Message : " + message);
   }
   public void init(){
      System.out.println("Bean is going through init.");
   }
   public void destroy() {
      System.out.println("Bean will destroy now.");
   }
}

Di seguito è riportato il contenuto del file MainApp.javafile. Qui è necessario registrare un hook di spegnimentoregisterShutdownHook()metodo dichiarato nella classe AbstractApplicationContext. Ciò garantirà un arresto regolare e chiamerà i metodi di distruzione pertinenti.

package com.tutorialspoint;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {
      AbstractApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");

      HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
      obj.getMessage();
      context.registerShutdownHook();
   }
}

Di seguito è riportato il file di configurazione Beans.xml richiesto per i metodi di inizializzazione e distruzione -

<?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 = "helloWorld" class = "com.tutorialspoint.HelloWorld" init-method = "init" 
      destroy-method = "destroy">
      <property name = "message" value = "Hello World!"/>
   </bean>

</beans>

Una volta terminata la creazione dei file di configurazione dei bean e dei sorgenti, eseguiamo l'applicazione. Se tutto va bene con la tua applicazione, stamperà il seguente messaggio:

Bean is going through init.
Your Message : Hello World!
Bean will destroy now.

Inizializzazione predefinita e metodi di distruzione

Se hai troppi bean con metodi di inizializzazione e / o di distruzione con lo stesso nome, non è necessario dichiararli init-method e destroy-methodsu ogni singolo chicco. Invece, il framework fornisce la flessibilità per configurare tale situazione utilizzandodefault-init-method e default-destroy-method attributi sull'elemento <beans> come segue:

<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"
   default-init-method = "init" 
   default-destroy-method = "destroy">

   <bean id = "..." class = "...">
      <!-- collaborators and configuration for this bean go here -->
   </bean>
   
</beans>