2009-06-06 6 views
4

Bei der Verwendung von Datenbankmigrationen möchte ich offensichtlich keine der DAOs verwenden, bevor die Migrationen ausgeführt werden.Kurzer Weg, um viele Beans zu machen, hängt von einer Bean ab

Im Moment deklariere ich viel von DAOs, die alle eine depends-on=databaseMigrator Eigenschaft haben. Ich finde das beunruhigend, besonders da es fehleranfällig ist.

Gibt es eine kompaktere Möglichkeit, dies zu tun?


Hinweise:

Antwort

3

Sie könnten versuchen, eine Klasse zu schreiben, die die BeanFactoryPostProcessor-Schnittstelle implementiert, um automatisch die Abhängigkeiten für Sie zu registrieren:

Warnung: Diese Klasse kompiliert nicht.

Sie könnten dann eine Bohne dieser Klasse neben all Ihren anderen Bohnen hinzufügen.

<bean class="DatabaseMigratorDependencyResolver"/> 

Spring wird automatisch starten, bevor es beginnt, den Rest der Bohnen zu initiieren.

+0

Sieht gut aus, danke. –

+0

Niemand mochte meine Lösung, also wähle ich Ihre als Antwort. Vielen Dank! –

3

Ich mache dies beim Start der Anwendung. Die Schemaversion, die von der Anwendung benötigt wird, wird als Teil des Buildprozesses in die Anwendung kompiliert. Es wird auch in der Datenbank gespeichert und von den Datenbankmigrationsskripten aktualisiert.

Beim Start der Anwendung überprüft die App, ob die Schemaversion in der Datenbank erwartet wird. Ist dies nicht der Fall, wird sofort mit einer eindeutigen Fehlermeldung abgebrochen.

In einem normalen Java-Programm geschieht dies direkt am Anfang der Hauptmethode.

In einer Webanwendung wird sie vom ServletContextListener der App ausgeführt und ist das erste, wenn der Servletkontext erstellt wird.

Das ist meine (Apps) Speck mehrmals gespeichert.

+0

Danke für die Antwort. Ich habe nach einer Spring-Lösung gesucht, da alle meine Datenquellen dort bereits deklariert sind. –

+0

Ich bin sicher, dass Sie Spring verwenden könnten, um dies zu implementieren. Ob es in diesem Fall tatsächlich hilft, ist eine andere Frage. – Nat

+0

Ob die Verwendung von Spring helfen würde? Dies geschieht natürlich dadurch, dass die Datenquellendefinitionen unitär gehalten werden und der Entwickler nicht überrascht wird, indem Komponenten außerhalb von Spring hinzugefügt werden. –

3

landete ich eine einfache ForwardingDataSource Klasse zu schaffen, die im Kontext erscheint Dateien wie:

<bean id="dataSource" class="xxx.ForwardingDataSource" depends-on="databaseMigrator"> 
    <property name="delegate"> 
     <!-- real data source here --> 
    </property> 
</bean> 

Wenn es weniger elegant als Adam Paynter's solution finden, aber klarer.

Verwandte Themen