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:
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
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:
postProcessBeforeInitialization(Object bean, String beanName)
heißt @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 @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.
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.
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.