spring beanバックプロセッサ

15223 ワード

記事の目次
  • バックプロセッサは何ですか?
  • リアプロセッサ実現クラス
  • リアプロセッサ
  • 運転呼び出し
  • マルチポストプロセッサ呼び出し
  • 1バックプロセッサは何ですか?
    一つのクラスで、インターフェースBenPostProcessor定義の二つの方法を実現しました.この二つの方法はそれぞれ、postProcess Before InitializationとpostProcess After Initiazationというものです.名前の通り、beanのinit-methodの前後でそれぞれこの二つの方法を実行します.マルチポストプロセッサの順序性のbeanは、使用中に複数の後置前処理を経てもよいが、一般的に、複数の後置プロセッサインターフェースを実現するクラスは先着順であり、IOCに後置プロセッサ間の先着順を明らかにするために、クラスはOrderedインターフェースを実現し、インターフェース内のorder属性によって後処理プロセッサの順序を制御してもよい.デフォルトは0で、最高優先度です.同じ容器の中の後置プロセッサは汎用的なcontextの中の後置プロセッサの実現クラスはある一つのbeanに対してではなく、このcontextの中の全てのbeanの発生過程はこの後置プロセッサを呼び戻します.
    2リアプロセッサ実現クラス
    BenPostProcessorインタフェースのソースコード
    	@Nullable
    	default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    		return bean;
    	}
    	@Nullable
    	default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    		return bean;
    	}
    
    このように、戻り値はnullではなく、Objectタイプでなければならず、contextからgetされたものと一致していることがわかる.デフォルトの実装があるので、方法を書き換える必要はありません.後のプロセッサクラスの例を参照してください.
    package      ;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.config.BeanPostProcessor;
    
    public class PostProcessorExample implements BeanPostProcessor {
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            if ("chinese".equals(beanName)) {
                System.out.println("     ,       bean id :" + beanName);
            } else {
                System.out.println("     ,       bean id :" + beanName);
            }
            return bean;
        }
    
    }
    
    beanNameを通じて処理したbeanを対象とした区分・処理を行う.
    3後置プロセッサ実装クラスbean配置
    
    <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.xsd">
    
        <bean id="chinese" class="        .Chinese">
        bean>
    
        <bean id="american" class="        .American">
        bean>
    
        <bean id="beanPostProcessor" class="     .PostProcessorExample">
        bean>
    
    beans>
    
    4起動コール
    メインクラス
    package      ;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.config.BeanPostProcessor;
    
    public class PostProcessorExample implements BeanPostProcessor {
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            if ("chinese".equals(beanName)) {
                System.out.println("     ,       bean id :" + beanName);
            } else {
                System.out.println("     ,       bean id :" + beanName);
            }
    
            return bean;
        }
    
    }
    
    このうちAmerica類はInitializingBen,Dispposable Beanの2つのインターフェースを実現しています.xml設定のメタデータには初期化と廃棄方法が含まれていません.Chineseは初期化と廃棄方法が全く指定されていません.
         ,       bean id :chinese
         ,       bean id :american
    American        
    American       
    
    5マルチバックプロセッサの呼び出し
    理想的な場合は、実現クラスにOrderedを実現させることが望ましいが、デフォルトでは、Spring容器は後置プロセッサの定義順序に従って順次呼び出される.
    
    <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.xsd">
        
      <bean id="narCodeService" class="com.test.service.impl.NarCodeServiceImpl">
      bean>
      <bean id="postProcessor" class="com.test.spring.PostProcessor"/>
      <bean id="postProcessorB" class="com.test.spring.PostProcessorB"/>
    beans>
    
    beanでメタデータを設定すると、IOC容器に最後にBバックプロセッサを起動させる.でも!公式はやはり順序インターフェースを実現して、明示的に定義された後置プロセッサの実装順序を実現することを提案します.