Sping ソース コード (7) - ポスト プロセッサ (カスタム ポスト プロセッサ)

前回の記事では Spring の invokeBeanFactoryPostProcessors メソッドの実行プロセスと BFPP クラスと BDRPP クラスの紹介を簡単に紹介しましたが、今回はクラスのポストプロセッサの実装をカスタマイズします。

カスタム PostProcessor PostProcessor
をカスタマイズするには 2 つの方法があり、どちらも invokeBeanFactoryPostProcessors() メソッドのパラメータに従って実装され、1 つは beanFactory に追加され、もう 1 つはパラメータ List<BeanFactoryPostProcessor> に追加されます。2 つのメソッドの実装には大きな違いはありません。この記事ではパラメータリストに追加する方法を説明します。

ソース コードでは、BDRPP タイプに応じて PostProcessorNames が複数回取得されることを覚えていますか? カスタム実装の過程では、postProcessBeanDefinitionRegistry()メソッド実行時に作成されたBDRPPクラスを復元​​し、RegistryCustomerBDRPPクラスを追加します。

public class RegistryCustomerBDRPP implements BeanDefinitionRegistryPostProcessor, PriorityOrdered {
    
    
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
    
    
        System.out.println("执行自定义RegistryCustomerBDRPP ,调用postProcessBeanDefinitionRegistry方法");
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
    
    
        System.out.println("执行自定义RegistryCustomerBDRPP ,调用postProcessBeanFactory方法");
    }

    @Override
    public int getOrder() {
    
    
        return 0;
    }
}

MyCustomerBeanDefinitionRegistryPostProcessor クラスの ppbdr メソッドを実行して、RegistryCustomerBDRPP を作成します。

public class MyCustomerBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor, PriorityOrdered {
    
    
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
    
    
        BeanDefinitionBuilder customer = BeanDefinitionBuilder.rootBeanDefinition(RegistryCustomerBDRPP.class);
        System.out.println("在BDRPP中注册新的 BDRPP");
        registry.registerBeanDefinition("customer",customer.getBeanDefinition());
        System.out.println("自定义BDRPP------------调用方法MyCustomerBeanDefinitionRegistryPostProcessor");
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
    
    
        System.out.println("Customer -----------实现BDRPP中postProcessBeanFactory方法");
    }

    @Override
    public int getOrder() {
    
    
        return 0;
    }
}

クラスが作成されました。次のステップは、それをパラメータ List<BeanFactoryPostProcessor> に追加する方法です。ソース コードを見ると、List<BeanFactoryPostProcessor> を取得するときに getBeanFactoryPostProcessors( ) 方法。具体的なソースコードの実行ロジックについては、前回のSping ソースコード (7) - ポストプロセッサで詳しく説明していますので、ご参照ください。

ソースコード

	protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
    
    

		PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
		//省略无用代码
		}
	}
	//具体调用方法
	public static void invokeBeanFactoryPostProcessors(
            ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
    
    
	//省略无用代码
}

Spring ソース コードに get メソッドがある場合、値を入力するための対応する add() メソッドまたは set() メソッドが必要です。
クリックすると、AbstractApplicationContextにgetBeanFactoryPostProcessors()メソッドが実装されていることがわかります。AbstractApplicationContextクラスの関係図は以下の通りです。サブクラスにClassPathXmlApplicationContextがあることがわかります。そのため、addBeanFactoryPostProcessor()を書き換えることでカスタマイズできます。 ClassPathXmlApplicationContext クラスを実装し、それに PostProcessor を追加します。

抽象アプリケーションコンテキスト

public abstract class AbstractApplicationContext extends DefaultResourceLoader
		implements ConfigurableApplicationContext {
    
    
	public List<BeanFactoryPostProcessor> getBeanFactoryPostProcessors() {
    
    
			return this.beanFactoryPostProcessors;
		}
	
	@Override
		public void addBeanFactoryPostProcessor(BeanFactoryPostProcessor postProcessor) {
    
    
			this.beanFactoryPostProcessors.add(postProcessor);
		}
}		

クラス図
ここに画像の説明を挿入

addBeanFactoryPostProcessor
このように、invokeBeanFactoryPostProcessorsメソッドが実行されると、getBeanFactoryPostProcessors()メソッドで追加したBDRPPが取得されます。

public class MyClassPathXmlApplicationContext extends ClassPathXmlApplicationContext {
    
    
	  	@Override
	    protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory) {
    
    
	        super.addBeanFactoryPostProcessor(new MyCustomerBeanDefinitionRegistryPostProcessor());
	    }
}	    

カスタム BDRPP を BeanFactory に追加する場合は、さらに簡単です。BDRPP をカスタマイズした後、<bean> タグを通じて Spring に BDRPP を認識させることができます。invokeBeanFactoryPostProcessorsを実行するとBeanFactory内で直接取得されます。

おすすめ

転載: blog.csdn.net/weixin_43936962/article/details/132500097