Ich verwende Spring 3.1.3 für eine Webanwendung, die XML-Konfiguration mit Komponentenscan verwendet.Warum hat Spring meine @DependsOn-Annotation ignoriert?
Ich erkannte, dass eine der gescannten Komponenten vor einigen anderen initialisiert werden muss. Für alle Klassen, die eine Initialisierung nach dem Konstruieren benötigen, habe ich eine Annotation @PostConstruct für eine Methode.
Um die Abhängigkeitsreihenfolge einzurichten, habe ich '@Component' in '@Component ("configData")' für die Klasse geändert, die vor den anderen erstellt werden muss. Ich fügte dann "@DependsOn (" configData ") 'unmittelbar vor jeder Klassendefinition hinzu, die NACH der Bean" configData "nachher erstellt werden muss.
Von dem, was ich gelesen habe, ist dies alles was ich brauche, um die Abhängigkeit Reihenfolge zu erzwingen.
Ich baute dann alles, setzte meine Haltepunkte und startete die App. Ich erwartete, den Haltepunkt in der Bean "configData" vor jedem der abhängigen Beans zu treffen. Das ist nicht passiert. Der erste Haltepunkt war in der "init" -Methode einer der abhängigen Beans.
Ich habe dann meine "log4j.xml" geändert, um "debug" als Protokollierungsebene für "org.springframework" zu setzen und meinen Test erneut durchzuführen. Das Breakpoint-Verhalten war das gleiche, und meine Protokollierung zeigte keine Debug-Informationen über die Spring-Initialisierung (ich habe das Debugging für die log4j-Initialisierung selbst aktiviert, also habe ich bestätigt, dass DEBUG für "org.springframework" eingestellt war).
Was könnte ich vermissen?
Update:
Wenn es darauf ankommt, sind hier ein paar Skelett Beispiele von dem, was ich hier tue.
@Component("configData")
public class ConfigData {
....
@PostConstruct
public void init() {
....
}
}
@Component
@DependsOn("configData")
public class ClassDependentOnConfigData extends BaseClass {
....
@Override
@PostConstruct
public void init() {
super.init();
....
}
}
Um es zu wiederholen, was ich zur Laufzeit zu finden, ist, dass die „init()“ Methode in „ClassDependentOnConfigData“ wird von Frühling vor dem „init()“ Methode in „ConfigData“ genannt zu werden.
Beachten Sie auch, dass "BaseClass" ein "@Autowired" für "ConfigData" hat.
können Sie die Bean-Definitionen erstellen (Java und/oder XML) der ConfigData Bohne und eine Bohne, die nach initialisiert werden sollen es als ein Beispiel? –
Ok, aber diese werden nur Skelette sein, und was Sie sehen werden, wird aus meiner Beschreibung offensichtlich sein. –
Wenn Sie keine Spring-Debug-Nachrichten sehen, haben Sie überprüft, dass Sie kein globales THRESHOLD-Set haben oder a One for appender? Mit anderen Worten - siehst du andere DEBUG-Nachrichten? –