BeanPostProcessor Verwirrung

8

Ich versuche, BeanPostProcessor im Frühling zu verstehen, und ich verstehe nicht, was es tut. Ist es richtig, dass der BeanPostProcessor zwei Methoden definiert, die an diesen Stellen aufgerufen werden:

  • Vor der Initialisierung (entweder init-Methode oder afterPropertiesSet), aber die Instanz wird erstellt.
  • Nach der Methode init oder afterPropertiesSet wird
  • aufgerufen

Stimmt das? Angesichts des Beispiels und des Textes auf Seite 118 und weiter ist es verwirrend. Ich denke nicht, dass ich mehr vom Text auf die Frage kopieren darf, aber die Anmerkungen und was dort passiert, ist schwer zu verstehen.

Und soll diese Schnittstelle auf den gewünschten Beans implementiert werden oder soll das auf einer Bean verwendet werden, die für viele Beans allgemein ist? Ich sehe, dass Sie beide und Objekt und String Argument übergeben.

  

Manchmal befinden Sie sich möglicherweise in einer Position, in der Sie es brauchen   führt eine zusätzliche Verarbeitung unmittelbar vor und nach dem Frühling durch   instanziiert die Bohne. Die Verarbeitung kann so einfach wie das Modifizieren sein   die Bohne oder so komplex wie ein ganz anderes Objekt! Das   Die BeanPostProcessor-Schnittstelle hat zwei Methoden:   postProcessBeforeInitialization, die vor Springaufrufen aufgerufen wird   Alle Bean-Initialisierungs-Hooks (wie z   InitializingBean.afterPropertiesSet oder die init-Methode), und   postProcessAfterInitialization, die Spring nach dem Aufruf von   Initialisierungs-Hooks sind erfolgreich.

Pro Spring 2.5, Seite 118

    
LuckyLuke 18.03.2012, 20:10
quelle

2 Antworten

18

Spring gibt Ihnen eine Menge Postprozessoren, nicht nur BeanPostProcessor . Auch die meisten von ihnen werden von der Quelle selbst verwendet. Der eine, den Sie in dieser Frage erwähnt haben, wird (wie der Name sagt) verwendet, um die Bean nach ihrer Instanziierung zu posten. Spring Container Verhalten ist wie folgt:

  • Spring instanziiert die Bean, die ihren Konstruktor aufruft
  • postProcessBeforeInitialization(Object bean, String beanName) heißt
  • Bean-Initialisierungsprozess: @PostConstruct , afterPropertiesSet() (definiert durch die InitializingBean Callback-Schnittstelle), benutzerdefiniert konfiguriert init Methode
  • postProcessAfterInitialization(Object bean, String beanName) heißt

Auf den ersten Blick mag es kompliziert und überwältigend aussehen, aber wenn Sie komplexe Anwendungen auf einer Spring-Oberfläche aufbauen, sind all diese Funktionen von unschätzbarem Wert.

Mögliche Szenarien, zum Beispiel (aus Spring selbst):

  • AutowiredAnnotationBeanPostProcessor - Sucht die beanspruchte Bean @Autowire Annotation, um die Abhängigkeitsinjektion durchzuführen
  • RequiredAnnotationBeanPostProcessor - prüft alle Abhängigkeiten markiert als @Required wurde injiziert.
  • ServletContextAwareProcessor - injiziert ServletContext zu Beans Implementieren von ServletContextAware interface
  • Tatsächlich werden Initialisierungs- / Destruktionsrückrufe wie JSR-250 @PostConstruct und @PreDestroy mit Hilfe des Postprozessors implementiert: CommonAnnotationBeanPostProcessor

Natürlich müssen alle genannten Postprozessoren in einer bestimmten Reihenfolge ausgeführt werden, aber das ist die Federverantwortung, um dies sicherzustellen.

    
Piotr De 19.03.2012, 18:51
quelle
6

Sie implementieren BeanPostProcessor um einen Service zu erstellen, der für alle Beans in dem Kontext gilt, in dem sie erstellt wurden. Die JavaDocs zeigen viele konkrete Beispiele, aber eines, das ich konsistent verwende, ist AutowiredAnnotationBeanPostProcessor . Dies verwendet Reflektion, um die Bean-Klasse nach @Autowired -Anmerkungen für Felder und Methoden zu durchsuchen.

%Vor%

Diese Funktion ist am nützlichsten, wenn Sie Ihr eigenes Framework über Spring oder Features erstellen, die für eine Teilmenge von vielen Beans gelten. Wahrscheinlicher ist, dass Sie die vorhandenen Bean-Postprozessoren von Spring verwenden.

    
David Harkness 18.03.2012 21:54
quelle

Tags und Links