前回の記事では 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内で直接取得されます。