tutorial que mvc framework example español ejemplo component bean anotaciones spring spring-mvc architecture

que - spring mvc 4 tutorial español



¿Cómo funciona exactamente el Spring BeanPostProcessor? (3)

El ejemplo típico para un postprocesador de beans es cuando desea envolver el bean original en una instancia de proxy, por ejemplo, cuando usa la anotación @Transactional .

El postprocesador de bean recibirá la instancia original del bean, puede llamar a cualquier método en el destino, pero también puede devolver la instancia de bean real que debe estar vinculada en el contexto de la aplicación, lo que significa que en realidad puede devolver cualquier objetar lo que quiere. El escenario típico cuando esto es útil es cuando el postprocesador de bean envuelve el objetivo en una instancia de proxy. Todas las invocaciones en el bean enlazado en el contexto de la aplicación pasarán a través del proxy, y el proxy luego realizará un poco de magia antes y / o después de las invocaciones en el bean de destino, por ejemplo, AOP o gestión de transacciones.

Estoy estudiando para la certificación Spring Core y tengo algunas dudas sobre cómo maneja Spring el ciclo de vida de los beans y, en particular, sobre el postprocesador de beans .

Entonces tengo este esquema:

Para mí está bastante claro lo que significa:

Los siguientes pasos tienen lugar en la fase de Definiciones de beans de carga :

  • Las clases de @Configuration se procesan y / o se analizan @Components y / o se analizan los archivos XML .

  • Definiciones de frijoles agregadas a BeanFactory (cada una indexada bajo su id)

  • Se invocan los beans especiales BeanFactoryPostProcessor , pueden modificar la definición de cualquier bean (por ejemplo, para los reemplazos de valores de marcador de posición de propiedad).

Luego, los siguientes pasos tienen lugar en la fase de creación de beans :

  • Cada bean se instancia con entusiasmo por defecto (creado en el orden correcto con sus dependencias inyectadas).

  • Después de la inyección de dependencia, cada bean pasa por una fase de posprocesamiento en la que pueden producirse más configuraciones e inicializaciones.

  • Después del procesamiento posterior, el bean está completamente inicializado y listo para su uso (seguido por su id hasta que se destruya el contexto)

Ok, esto es bastante claro para mí y también sé que hay dos tipos de postprocesadores de frijoles que son:

  • Inicializadores: inicialice el bean si se le indica (es decir, @PostConstruct).

  • y Todo lo demás: que permite una configuración adicional y que puede ejecutarse antes o después del paso de inicialización

Y publico esta diapositiva:

Entonces, es muy claro para mí qué hacen los inicializadores de los postprocesadores de frijoles (son los métodos anotados con la anotación @PostContruct y que se invocan automáticamente inmediatamente después de los métodos de establecimiento (por lo tanto, después de la inyección de dependencia), y sé que puedo usar para realizar un lote de inicialización (como llenar un caché como en el ejemplo anterior).

Pero, ¿qué representa exactamente el otro postprocesador de beans? ¿Qué queremos decir cuando decimos que estos pasos se realizan antes o después de la fase de inicialización ?

Entonces mis beans son instanciados y sus dependencias son inyectadas, entonces la fase de inicialización se completa (mediante la ejecución de un método anotado @PostContruct ). ¿Qué queremos decir con decir que se utiliza un Bean Post Processor antes de la fase de inicialización? ¿Significa que sucede antes de la ejecución del método anotado @PostContruct ? ¿Significa que podría suceder antes de la inyección de dependencia (antes de que se llamen los métodos de establecimiento)?

¿Y a qué nos referimos exactamente cuando decimos que se realiza después del paso de inicialización ? Significa que sucede después de eso, la ejecución de un método anotado @PostContruct , ¿o qué?

Puedo entender fácilmente por qué necesito un método anotado @PostContruct , pero no puedo encontrar algún ejemplo típico del otro tipo de postprocesador de beans, ¿puede mostrarme algún ejemplo típico de cuándo se usan?


La diferencia es que BeanPostProcessor se conectará a la inicialización de contexto y luego llamará a postProcessBeforeInitialization y postProcessAfterInitialization para todos los beans definidos.

Pero @PostConstruct solo se usa para la clase específica que desea personalizar la creación de @PostConstruct después del constructor o el método set.


Spring doc explica los BPP en Personalizar beans utilizando BeanPostProcessor . Los beans BPP son un tipo especial de beans que se crean antes que cualquier otro bean e interactúan con los beans recién creados. Con esta construcción, Spring le brinda medios para conectar y personalizar el comportamiento del ciclo de vida simplemente implementando un BeanPostProcessor usted mismo.

Tener un BPP personalizado como

public class CustomBeanPostProcessor implements BeanPostProcessor { public CustomBeanPostProcessor() { System.out.println("0. Spring calls constructor"); } @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println(bean.getClass() + " " + beanName); return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println(bean.getClass() + " " + beanName); return bean; } }

se llamaría e imprimiría la clase y el nombre del bean para cada bean creado.

Para entender cómo se ajusta el método al ciclo de vida del bean y cuándo exactamente se llama al método, verifique los docs

postProcessBeforeInitialization (Object bean, String beanName) Aplique este BeanPostProcessor a la nueva instancia de bean dada antes de cualquier devolución de llamada de inicialización de bean (como InitializingBean''s afterPropertiesSet o un método init personalizado).

postProcessAfterInitialization (Object bean, String beanName) Aplique este BeanPostProcessor a la nueva instancia de bean dada después de cualquier devolución de llamada de inicialización de bean (como InitializingBean''s afterPropertiesSet o un método init personalizado).

Lo importante también es que

El bean ya se completará con valores de propiedad.

Por lo que respecta a la relación con @PostConstruct tenga en cuenta que esta anotación es una forma conveniente de declarar un método postProcessAfterInitialization , y Spring se da cuenta cuando registra CommonAnnotationBeanPostProcessor o especifica el <context:annotation-config /> en el archivo de configuración de bean . Si el método @PostConstruct se ejecutará antes o después de cualquier otro postProcessAfterInitialization depende de la propiedad del order

Puede configurar varias instancias de BeanPostProcessor, y puede controlar el orden en que se ejecutan estos BeanPostProcessor configurando la propiedad de orden.