Was ist die richtige Methode zur Aktivierung der @PostConstruct über CommonAnnotationBeanPostProcessor von Java-Konfiguration?
Ich bin mit Spring 4 mit SpringBoot und Spring-Web mit Java-Konfiguration.
Meine @PostConstruct
annotierten Methoden ausgeführt von Frühling zu starten, ist es notwendig sich zu registrieren CommonAnnotationBeanPostProcessor
mit dem Kontext, der sonst @PostConstruct
ignoriert.
In eine XML-basierte Spring-Konfiguration, die docs sagen, Sie zu benutzen (unter den Bohnen-element)
<context:annotation-config/>
Habe ich auch ein Beispiel gesehen, wo die Registrierung erfolgt auf einer einzelnen bean-basis, etwa so:
<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />
Möchte ich vermeiden, wenn möglich. Mein Projekt enthält keine XML-Datei, und keiner ist, erzeugt für mich in meinem build-Ordner.
Derzeit ist meine Lösung, um kommentieren meiner Klasse mit @ComponentScan
, die glaube ich, bewirkt, dass der Frühling zu erkennen und zu registrieren @Component
s und @Bean
s.
Irgendwie ist dieses Ursachen CommonAnnotationBeanPostProcessor
aufgerufen werden, ich hab zwar keine Ahnung warum, aber es löst mein problem!
(Diese Klasse hat eine @Autowired
Eigenschaft, die null am Start - daher die Notwendigkeit, führen Sie die Initialisierung über @PostConstruct
)
Aber wieder meine Frage, was ist der richtige Weg, dies zu erreichen mit Hilfe der Java-Konfiguration? Danke!
BeanPostProcessor
s (nicht empfohlen) oder durch die Verwendung <context:annotation-config />
(welche bereits implizit bei der Verwendung von <context:component-scan />
. Oder mit einem ApplicationContext
Implementierung, die standardmäßig verwendet Anmerkungen wie die AnnotationConfigApplicationContext
. Es gibt keine einzige richtige Weg, es zu tun al den erwähnten Arten gültig sind.Die Tatsache, dass Sie eine
@Autowired
Eigenschaft, die null sollte nicht der Fall sein, wie der Frühling sollte autowire. In der Regel bedeutet dies, dass Sie habe nicht gesagt, der Kontext, die Sie verwenden möchten annotation .Deinum Danke. Um zu klären, die
@Autowired
Eigenschaft eingespritzt wird, aber der Wert ist noch nicht verfügbar zum Zeitpunkt der statischen/Instanz-Konstruktoren ausgeführt werden, daher ist der Einsatz von @PostConstruct. Der Rahmen ist bewusst etwas "Anmerkungen", (vielleicht über @SpringBootApplication
, @Configuration
und @Component
welche ich verwende), aber docs Staat, der @PostConstruct ist nicht einer von Ihnen und so einige Weg, um zu gewinnen CommonAnnotationBeanPostProcessor
benötigt wird. Ich möchte, dass die Art und Weise, um die Konsistenz mit Java-Konfiguration (ohne XML).Die
@PostConstruct
ist schon verarbeitet, wenn Sie aktiviert haben, die annotation, das ist standardmäßig der Fall, wenn Sie die java-basierte Konfiguration.InformationsquelleAutor zkn | 2015-12-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie InitializingBean als eine Alternative Lösung.
Erweitern Sie ganz einfach das interface und überschreiben afterPropertiesSet Methode, die aufgerufen wird, nachdem alle die Eigenschaften der bean-so wie post-Konstrukt.
Beispiel:
code
@Component public class Beispiel implements InitializingBean { @Autowired private MyThing myThing; @Override public void afterPropertiesSet() throws Exception { // nutzen myThing hier, nachdem es injiziert. } }code
@Braj ich lasse die Frage offen für den Augenblick zu sammeln, mehr wissen. Schließen Sie es in ein paar Tagen.Die Spring-Dokumentation schreckt Sie diese Schnittstelle verwenden, weil es unnötig Paare der code auf den Frühling. Initialisierungs callbacks
Ich Stimme mit Ihnen überein. In einer anderen Weise, die wir verwenden können
@PostContruct
annotation oderinit-method
. BeispielInformationsquelleAutor Braj
Dies ist nicht eine Antwort auf meine Frage gestellt, aber eine weitere alternative.
Konnte ich umgesetzt haben, die Lebenszyklus interface und meine Initialisierung in der
start()
Methode. Zu der Zeit war ich ratlos, was die Rückkehr für dieisRunning()
Methode, obwohl im Nachhinein sagtreturn true
gewesen wäre, gut genug, wie ist die Lebensdauer der Anwendung-lange. Anregungen zu diesem Punkt wäre willkommen.Andere alternativen abgeleitet werden kann aus hier, nämlich
welche, die ich sammeln, können auf jeden
@Bean
seine optionale init () - Methode aufgerufen. (Ich habe es nicht ausprobiert).Immer noch, ich hoffe auf eine Antwort auf meine Frage, verwendet die Java-Konfiguration.
InformationsquelleAutor zkn