Código fuente de Sping (siete): posprocesador (postprocesador personalizado)

El artículo anterior presentó brevemente el proceso de ejecución del método invokeBeanFactoryPostProcessors en Spring, así como la introducción de las clases BFPP y BDRPP. En este artículo, personalizaremos la implementación de un postprocesador de una clase.

PostProcessor personalizado
Hay dos formas de personalizar PostProcessor, las cuales se implementan de acuerdo con los parámetros en el método invokeBeanFactoryPostProcessors (), una de las cuales se agrega a beanFactory y la otra se agrega al parámetro List <BeanFactoryPostProcessor>. La implementación de los dos métodos no es muy diferente. Este artículo explicará cómo agregar a la lista de parámetros.

¿Recuerda que en el código fuente, PostProcessorNames se obtendrá varias veces según el tipo BDRPP? En el proceso de implementación personalizada, restauraremos la clase BDRPP creada al ejecutar el método postProcessBeanDefinitionRegistry() y se agregará la clase 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;
    }
}

Cree RegistryCustomerBDRPP ejecutando el método ppbdr en la clase MyCustomerBeanDefinitionRegistryPostProcessor.

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

La clase ha sido creada y el siguiente paso es cómo agregarla al parámetro List <BeanFactoryPostProcessor>. Mirando el código fuente, no es difícil encontrar que al obtener List <BeanFactoryPostProcessor>, se obtiene a través de getBeanFactoryPostProcessors ( ) método. Para conocer la lógica de ejecución del código fuente específico, consulte el código fuente de Sping anterior (7): posprocesador para obtener una explicación detallada.

código fuente

	protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
    
    

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

En el código fuente de Spring, si hay un método get, debe haber un método add() o set() correspondiente para completar el valor.
Al hacer clic, puede encontrar que el método getBeanFactoryPostProcessors () está implementado en AbstractApplicationContext. El diagrama de relación de clases de AbstractApplicationContext es el siguiente. Puede ver que hay un ClassPathXmlApplicationContext en la subclase. Por lo tanto, podemos personalizarlo reescribiendo addBeanFactoryPostProcessor() implementando la clase ClassPathXmlApplicationContext y agregue el PostProcessor.

ResumenAplicaciónContexto

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

diagrama de clase
inserte la descripción de la imagen aquí

addBeanFactoryPostProcessor
De esta manera, cuando se ejecuta el método invokeBeanFactoryPostProcessors, el BDRPP que agregamos se obtendrá en el método getBeanFactoryPostProcessors ().

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

Y si desea agregar BDRPP personalizado a BeanFactory, es aún más fácil: después de personalizar BDRPP, puede dejar que Spring reconozca su BDRPP a través de la etiqueta <bean>. Al ejecutar invokeBeanFactoryPostProcessors, se obtendrá directamente en BeanFactory.

Supongo que te gusta

Origin blog.csdn.net/weixin_43936962/article/details/132500097
Recomendado
Clasificación