Spring-Beanポストプロセッサ

ザ・ BeanPostProcessor インターフェースは、独自のインスタンス化ロジック、依存関係解決ロジックなどを提供するために実装できるコールバックメソッドを定義します。1つ以上のBeanPostProcessor実装をプラグインすることにより、SpringコンテナーがBeanのインスタンス化、構成、および初期化を完了した後に、いくつかのカスタムロジックを実装することもできます。 。

複数のBeanPostProcessorインターフェースを構成でき、これらのBeanPostProcessorインターフェースが実行される順序を制御するには、 order BeanPostProcessorが実装する場合のプロパティ Ordered インターフェース。

BeanPostProcessorsはBean(またはオブジェクト)インスタンスで動作します。つまり、Spring IoCコンテナーがBeanインスタンスをインスタンス化し、BeanPostProcessorインターフェースがその作業を実行します。

アン ApplicationContext の実装で定義されたBeanを自動的に検出します BeanPostProcessor これらのBeanをインターフェースし、ポストプロセッサーとして登録し、Beanの作成時にコンテナーによって適切に呼び出されるようにします。

次の例は、ApplicationContextのコンテキストでBeanPostProcessorsを作成、登録、および使用する方法を示しています。

動作するEclipseIDEを配置し、次の手順を実行してSpringアプリケーションを作成しましょう-

ステップ 説明
1 SpringExampleという名前のプロジェクトを作成し、の下にパッケージcom.tutorialspointを作成します。src 作成したプロジェクトのフォルダ。
2 Spring Hello Worldの例の章で説明されているように、[外部JARの追加]オプションを使用して必要なSpringライブラリを追加します。
3 com.tutorialspointパッケージの下にJavaクラスHelloWorldInitHelloWorld、およびMainAppを作成します。
4 Beans構成ファイルBeans.xmlsrc フォルダ。
5 最後のステップは、すべてのJavaファイルとBean構成ファイルのコンテンツを作成し、以下で説明するようにアプリケーションを実行することです。

これがの内容です 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.");
   }
}

これは、Beanの初期化の前後にBean名を出力する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クラスで宣言されているメソッド。これにより、正常なシャットダウンが保証され、関連するdestroyメソッドが呼び出されます。

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.