2012-03-18 27 views
8

Sto cercando di capire BeanPostProcessor in Spring e non capisco cosa faccia. È vero che la BeanPostProcessor definisce due metodi che si chiama questi punti:Confusione BeanPostProcessor

  • Prima inizializzazione (sia metodo init o afterPropertiesSet), ma viene creata l'istanza.
  • Dopo il metodo init o il metodo afterPropertiesSet viene chiamato

E 'corretto? Dato l'esempio e il testo a pagina 118, inoltre è confuso. Non penso di essere autorizzato a copiare altro dal testo alla domanda, ma le annotazioni e ciò che sta accadendo là sono difficili da capire.

E si suppone di implementare questa interfaccia sui bean che si desidera o si suppone utilizzarli su un bean generale per molti bean? Vedo che si ottiene sia e l'oggetto e la stringa argomento passato in.

A volte, si può trovare in una posizione in cui è necessario performsome ulteriori elaborazioni immediatamente prima e dopo Primavera un'istanza il fagiolo. L'elaborazione può essere semplice come modificare il bean o complesso come restituire un oggetto completamente diverso! L'interfaccia BeanPostProcessor ha due metodi: postProcessBeforeInitialization, che viene chiamato prima molla chiama eventuali ganci inizializzazione fagiolo (come InitializingBean.afterPropertiesSet o init-metodo), e postProcessAfterInitialization, che chiama Spring dopo le ganci inizializzazione successo.

Pro Primavera 2.5, pagina 118

risposta

18

Spring offre molti post processor, non solo BeanPostProcessor. Inoltre, molti di loro sono usati dalla stessa primavera. Quella che hai menzionato in questa domanda, è usata (come afferma il suo nome) per postare il bean di processo dopo la sua istanziazione.comportamento contenitore molla è il seguente:

  • molla istanzia fagiolo chiamata al costruttore
  • postProcessBeforeInitialization(Object bean, String beanName) chiamato
  • fagiolo processo di inizializzazione: @PostConstruct, afterPropertiesSet() (definito dall'interfaccia InitializingBean callback), configurato personalizzato init metodo
  • postProcessAfterInitialization(Object bean, String beanName) si chiama

A prima vista, può sembrare complicato e travolgente, ma quando si costruiscono applicazioni complesse in cima alla primavera, tutte queste funzionalità sono di valore inestimabile.

possibili scenari, sono ad esempio (tratto da molla stessa):

  • AutowiredAnnotationBeanPostProcessor - scansioni di fagioli alla ricerca di @Autowire annotazioni al fine di eseguire l'iniezione di dipendenza
  • RequiredAnnotationBeanPostProcessor - controlla se tutte le dipendenze contrassegnati come @Required è stato iniettato.
  • ServletContextAwareProcessor - inietta ServletContext ai semi attuazione ServletContextAware interfaccia
  • realtà, inizializzazione/callback desctruction come JSR-250 @PostConstruct e @PreDestroy vengono implementati utilizzando post processore: CommonAnnotationBeanPostProcessor

Naturalmente tutti i post processori menzionati devono essere eseguito in un ordine specifico, ma questa è la responsabilità di Spring per garantirlo.

6

Si implementa BeanPostProcessor per costruire un servizio che si applica a tutti i fagioli nel contesto in cui sono stati creati. I JavaDocs mostrano molti esempi concreti, ma uno che uso costantemente è AutowiredAnnotationBeanPostProcessor. Questo utilizza la riflessione per analizzare la classe bean per le annotazioni @Autowired su campi e metodi.

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

Questa funzione è particolarmente utile quando si costruisce il proprio quadro sulla parte superiore della primavera o di funzioni che vengono applicate attraverso un sottoinsieme di molti fagioli. Più probabilmente userai i post-processori di bean esistenti forniti da Spring.

+0

Questa è una risposta migliore rispetto alla risposta accettata. –