Principio de Desarrollo-Anotación Impulsado por Spring BeanFactoryPostProcessor

Prólogo

  En los artículos anteriores, hemos visto el poderoso papel de los posprocesadores en Spring. Se menciona que la subinterfaz BeanPostProcessor se puede dividir aproximadamente en dos categorías, que juegan un papel poderoso en la instanciación e inicialización de beans (específico por favor Ver Principios de AOP para una comparación). Hoy conocemos otro tipo de postprocesador BeanFactoryPostProcessor.

 

BeanFactoryPostProcessor

 

 

@FunctionalInterface
 public  interface BeanFactoryPostProcessor  { 

    / ** 
     * Modifique la fábrica de beans interna del contexto de la aplicación después de su 
     inicialización estándar *. Se habrán cargado todas las definiciones de beans, pero aún no 
     se habrá instanciado ningún bean *. Esto permite anular o agregar 
     propiedades * incluso a los beans de inicialización ansiosa. 
     * @Param BeanFactory la fábrica de beans utilizado por el contexto de aplicación 
     * @throws org.springframework.beans.BeansException en caso de errores
      * / 
    void postProcessBeanFactory (ConfigurableListableBeanFactory BeanFactory)lanza BeansException; 

}

 

BeanFactoryPostProcessor es de después de BeanFactory llamada de inicialización estándar para personalizar y modificar el contenido de la BeanFactory;
Todas las definiciones de bean se han guardado y cargado en beanFactory, pero la instancia de bean aún no se ha creado y el
BeanFactoryPostProcessor personalizado
@Component
 pública  clase MyBeanFactoryPostProcessor implementos BeanFactoryPostProcessor { 

    @ Override 
    pública  vacío postProcessBeanFactory (ConfigurableListableBeanFactory BeanFactory) lanza BeansException { 
        System.out.println ( "MyBeanFactoryPostProcessor ... postProcessBeanFactory ..." );
        int cuenta = beanFactory.getBeanDefinitionCount (); 
        Cadena [] nombres = beanFactory.getBeanDefinitionNames (); 
        System.out.println ( "当前 BeanFactory 中 有" + cuenta + "个 Bean" ); 
        System.out.println (Arrays.asList (nombres));
    } 

}

Cómo encontrar todos los BeanFactoryPostProcessors y ejecutar sus métodos al actualizar la pila de llamadas del contenedor IOC ;
        // . El último, el invocar otros Todas BeanFactoryPostProcessors 
        Lista <BeanFactoryPostProcessor> nonOrderedPostProcessors = new new ArrayList <> (nonOrderedPostProcessorNames.size ()); 
    
// directamente BeanFactory encontrar todo tipo están en BeanFactoryPostProcessor componentes y ejecutar sus métodos de (String postProcessorName : nonOrderedPostProcessorNames) { nonOrderedPostProcessors.add ( beanFactory.getBean (postProcessorName, BeanFactoryPostProcessor.class) ); } invokeBeanFactoryPostProcessors (nonOrderedPostProcessors, beanFactory);

Todos los postprocesadores BeanFactoryPostProcessor

 

Registre la información de definición de bean a  través de BeanDefinitionRegistryPostProcessor

A continuación , registre el componente b en el contenedor a través del registrador de BeanDefinitionRegistryPostProcessor

@Component
 pública  clase MyBeanDefinitionRegistryPostProcessor los implementos BeanDefinitionRegistryPostProcessor { 

    @ Override 
    pública  vacío postProcessBeanFactory (ConfigurableListableBeanFactory BeanFactory) lanza BeansException {
         // autogenerado TODO Método del trozo, 
        "el número de MyBeanDefinitionRegistryPostProcessor ... frijol:" System.out.println (+ beanFactory.getBeanDefinitionCount () ); 
    } 

    / / Guardar centro de información de definición de frijol BeanDefinitionRegistry, después BeanFactory se crea en cada instancia de una información de definición de grano de frijol almacenado en el interior BeanDefinitionRegistry;
     @Override
     pública  nulapostProcessBeanDefinitionRegistry (registro BeanDefinitionRegistry) arroja BeansException {
         // TODO stub de método generado automáticamente 
        System.out.println ("postProcessBeanDefinitionRegistry ... bean 的 数量 :" + register.getBeanDefinitionCount ());
        // RootBeanDefinition beanDefinition = new RootBeanDefinition (Blue.class); 
        AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition (Blue. Class ) .getBeanDefinition (); Registry.registerBeanDefinition 
        ( "hola" , beanDefinition); 
    } 

}

 

 
                } 
                SortPostProcessors (currentRegistryProcessors, BeanFactory); 
                registryProcessors.addAll (currentRegistryProcessors); 
          // su vez desencadena todos postProcessBeanDefinitionRegistry () método invokeBeanDefinitionRegistryPostProcessors (currentRegistryProcessors, Registro) ; currentRegistryProcessors.clear (); }
// Ahora, la devolución de llamada Invoke El postProcessBeanFactory Todo de Procesadores manejado hasta ahora.
       // Busquemos el componente BeanFactoryPostProcessor del contenedor ; luego activemos el método
postProcessBeanFactory ( ) invokeBeanFactoryPostProcessors (registerProcessors, beanFactory); invokeBeanFactoryPostProcessors (regularPostProcessors, beanFactory);
 

Resumen

  BeanPostProcessor está diseñado para la inicialización de bean , y BeanFactoryPostProcessor está diseñado para la inicialización de beanFactory . beanFactory contiene la información de definición del bean,

Se puede usar para agregar algunos componentes al contenedor (en la definición de bean, toda la información de definición del bean agregado a beanFactory necesita ser instanciada).

Lo siguiente viene de la red 
BeanPostProcessor
: postprocesador de bean, trabajo de intercepción antes y después de la inicialización del objeto de creación de bean 1 , BeanFactoryPostProcessor: postprocesador de beanFactory; llamado después de la inicialización estándar de BeanFactory , para personalizar y modificar el contenido de BeanFactory; todo La definición de bean se ha guardado y cargado en beanFactory, pero la instancia de bean no se ha creado. Principio de BeanFactoryPostProcessor: 1 ), objeto de creación de contenedor ioc 2 ), invokeBeanFactoryPostProcessors (beanFactory); cómo encontrar todos los BeanFactoryPostProcessor y ejecutar sus métodos; 1 ), directamente en Bean Encuentre todos los componentes cuyo tipo es BeanFactoryPostProcessor y ejecute su método 2 ), realice 2 antes de la creación inicial de otros componentes , BeanDefinitionRegistryPostProcessor extiende BeanFactoryPostProcessor postProcessBeanDefinitionRegistry (); En toda la información de definición de bean se cargará, la instancia de bean no se ha creado; Tome precedencia sobre BeanFactoryPostProcessor; use BeanDefinitionRegistryPostProcessor para agregar algunos componentes adicionales al contenedor; principio: 1 ), ioc create object 2), refresh () -> invokeBeanFactoryPostProcessors (beanFactory); 3 ), obtenga todos los componentes de BeanDefinitionRegistryPostProcessor del contenedor. 1. Active todos los métodos postProcessBeanDefinitionRegistry () por turno 2. Luego active el método postProcessBeanFactory () BeanFactoryPostProcessor; 4) Luego encuentre el componente BeanFactoryPostProcessor del contenedor; luego active el método postProcessBeanFactory () por turno

 





 

Supongo que te gusta

Origin www.cnblogs.com/tombky/p/12716985.html
Recomendado
Clasificación