Spring - Bean Post Processor

Il BeanPostProcessor l'interfaccia definisce i metodi di callback che è possibile implementare per fornire la propria logica di istanziazione, logica di risoluzione delle dipendenze, ecc. È anche possibile implementare una logica personalizzata dopo che il contenitore Spring ha terminato di istanziare, configurare e inizializzare un bean collegando una o più implementazioni BeanPostProcessor .

È possibile configurare più interfacce BeanPostProcessor e controllare l'ordine in cui vengono eseguite queste interfacce BeanPostProcessor impostando order purché BeanPostProcessor implementi la proprietà Ordered interfaccia.

I BeanPostProcessor operano su istanze di bean (o oggetto), il che significa che il contenitore Spring IoC crea un'istanza di bean e quindi le interfacce BeanPostProcessor fanno il loro lavoro.

Un ApplicationContext rileva automaticamente tutti i bean definiti con l'implementazione di BeanPostProcessor e registra questi bean come postprocessori, per essere poi richiamati in modo appropriato dal contenitore al momento della creazione del bean.

Esempio

Gli esempi seguenti mostrano come scrivere, registrare e utilizzare BeanPostProcessors nel contesto di un ApplicationContext.

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 , InitHelloWorld 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.");
   }
}

Questo è un esempio molto semplice di implementazione di BeanPostProcessor, che stampa un nome di bean prima e dopo l'inizializzazione di qualsiasi bean. È possibile implementare una logica più complessa prima e dopo l'inizializzazione di un bean perché si ha accesso all'oggetto bean all'interno di entrambi i metodi del post processore.

Ecco il contenuto di InitHelloWorld.java file -

package com.tutorialspoint;

import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.beans.BeansException;

public class InitHelloWorld implements BeanPostProcessor {
   public Object postProcessBeforeInitialization(Object bean, String beanName) 
      throws BeansException {
      
      System.out.println("BeforeInitialization : " + beanName);
      return bean;  // you can return any other object as well
   }
   public Object postProcessAfterInitialization(Object bean, String beanName) 
      throws BeansException {
      
      System.out.println("AfterInitialization : " + beanName);
      return bean;  // you can return any other object as well
   }
}

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>

   <bean class = "com.tutorialspoint.InitHelloWorld" />

</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:

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