Spring - постпроцессоры Bean

В BeanPostProcessor interface определяет методы обратного вызова, которые вы можете реализовать для предоставления вашей собственной логики создания экземпляров, логики разрешения зависимостей и т. д. Вы также можете реализовать некоторую пользовательскую логику после того, как контейнер Spring завершит создание экземпляра, настройку и инициализацию bean-компонента, подключив одну или несколько реализаций BeanPostProcessor .

Вы можете настроить несколько интерфейсов BeanPostProcessor, и вы можете контролировать порядок, в котором эти интерфейсы BeanPostProcessor выполняются, установив параметр order свойство при условии, что BeanPostProcessor реализует Ordered интерфейс.

BeanPostProcessors работают с экземплярами bean (или объекта), что означает, что контейнер Spring IoC создает экземпляр bean-компонента, а затем интерфейсы BeanPostProcessor выполняют свою работу.

An ApplicationContext автоматически обнаруживает любые bean-компоненты, которые определены с реализацией BeanPostProcessor интерфейс и регистрирует эти bean-компоненты как постпроцессоры, которые затем соответствующим образом вызываются контейнером при создании bean-компонента.

пример

В следующих примерах показано, как писать, регистрировать и использовать BeanPostProcessors в контексте ApplicationContext.

Разрешите нам иметь рабочую среду IDE Eclipse и предпринять следующие шаги для создания приложения Spring:

Шаги Описание
1 Создайте проект с именем SpringExample и создайте пакет com.tutorialspoint подsrc папку в созданном проекте.
2 Добавьте необходимые библиотеки Spring с помощью опции « Добавить внешние JAR», как описано в главе « Пример Spring Hello World» .
3 Создайте классы Java HelloWorld , InitHelloWorld и MainApp в пакете com.tutorialspoint .
4 Создайте файл конфигурации Beans Beans.xml подsrc папка.
5 Последним шагом является создание содержимого всех файлов Java и файла конфигурации компонента и запуск приложения, как описано ниже.

Вот содержание HelloWorld.java файл -

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

Это очень простой пример реализации BeanPostProcessor, который печатает имя bean-компонента до и после инициализации любого bean-компонента. Вы можете реализовать более сложную логику до и после инициализации компонента, потому что у вас есть доступ к объекту компонента внутри обоих методов постпроцессора.

Вот содержание InitHelloWorld.java файл -

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
   }
}

Ниже приводится содержание MainApp.javaфайл. Здесь нужно зарегистрировать хук выключенияregisterShutdownHook(), объявленный в классе AbstractApplicationContext. Это обеспечит плавное завершение работы и вызовет соответствующие методы уничтожения.

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();
   }
}

Ниже приведен файл конфигурации Beans.xml требуется для методов init и destroy -

<?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>

Когда вы закончите создание исходного файла и файлов конфигурации bean-компонента, позвольте нам запустить приложение. Если с вашим приложением все в порядке, оно напечатает следующее сообщение -

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