2012-03-18 8 views
8

Intento entender BeanPostProcessor en Spring y no entiendo qué hace. Es correcto que la BeanPostProcessor define dos métodos que se llama en estos puntos:BeanPostProcessor confusion

  • antes de la inicialización (cualquiera de los métodos init o afterPropertiesSet), pero se crea la instancia.
  • Después de que el método init o método afterPropertiesSet se llama

¿Es eso correcto? Dado el ejemplo y el texto en la página 118 y más, es confuso. No creo que se me permita copiar más del texto a la pregunta, pero las anotaciones y lo que está sucediendo allí son difíciles de entender.

¿Y se supone que debes implementar esta interfaz en los beans que quieres o se supone que debes usar esto en un bean que es general para muchos beans? Veo que se obtiene tanto y el objeto y la cadena argumento pasado en.

A veces, usted puede encontrarse en una posición donde tiene que performsome procesamiento adicional inmediatamente antes y después de la primavera una instancia del frijol. ¡El procesamiento puede ser tan simple como modificar el bean o tan complejo como devolver un objeto completamente diferente! La interfaz BeanPostProcessor tiene dos métodos: postProcessBeforeInitialization, que se llama antes de la primavera llama cualquier ganchos de inicialización de frijol (tales como InitializingBean.afterPropertiesSet o el init-método), y postProcessAfterInitialization, que primavera llama después de que los ganchos de inicialización éxito.

Pro Primavera 2.5, página 118

Respuesta

18

Spring le ofrece una gran cantidad de post procesadores, no solo BeanPostProcessor. Además, la mayoría de ellos son utilizados por la primavera misma. El que mencionaste en esta pregunta, se usa (como su nombre lo indica) para procesar el bean después de su instanciación.comportamiento recipiente primavera es como sigue:

  • resorte crea la instancia de bean llamando a su constructor
  • postProcessBeforeInitialization(Object bean, String beanName) se llama
  • bean proceso de inicialización: @PostConstruct, afterPropertiesSet() (definida por la interfaz InitializingBean de devolución de llamada), configurado de encargo init método
  • postProcessAfterInitialization(Object bean, String beanName) se llama

A primera vista, puede parecer complicado y abrumador, pero cuando construyes aplicaciones complejas en la parte superior de Spring, todas estas características son invaluables.

escenarios

posibles, están por ejemplo (tomado de la primavera en sí):

  • AutowiredAnnotationBeanPostProcessor - escanea frijol buscando @Autowire anotación con el fin de llevar a cabo la inyección de dependencias
  • RequiredAnnotationBeanPostProcessor - comprueba si todas las dependencias marcados como @Required ha sido inyectado.
  • ServletContextAwareProcessor - inyecta ServletContext a los frijoles implementar ServletContextAware interfaz
  • realidad, inicialización/devoluciones de llamada desctruction como JSR-250 @PostConstruct y @PreDestroy se implementan utilizando procesador de mensaje: CommonAnnotationBeanPostProcessor

Por supuesto todos los post procesadores mencionados deben ser ejecutado en un orden específico, pero esta es la responsabilidad de Spring para garantizarlo.

6

Implementa BeanPostProcessor para construir un servicio que se aplica a todos los granos en el contexto medida que se crean. Los JavaDocs muestran muchos ejemplos concretos, pero uno que uso consistentemente es AutowiredAnnotationBeanPostProcessor. Esto usa reflexión para escanear la clase de bean para anotaciones @Autowired en campos y métodos.

public class MyBean { 
    @Autowired MyOtherBean otherBean; // assigned by AutowiredAnnotationBPP 
    ... 
} 

Esta instalación es más útil cuando la construcción de su propio marco en la parte superior de la primavera o funciones que se aplican a través de un subconjunto de muchos granos. Es más probable que use los postprocesadores de frijol existentes que proporciona Spring.

+0

Esta es una mejor respuesta que la aceptada. –