2013-10-11 12 views
5

Ich brauche ein Mittel zum Erstellen einer benutzerdefinierte Anmerkung wieIndividuelle Annotation wie @Value

@Value("${my.property}") 

jedoch in meinem Fall hinzuzufügen, ich brauche den Wert aus einer Datenbank erhalten eher dann eine Eigenschaftsdatei.

Grundsätzlich möchte ich eine Bean beim Start des Containers erstellen, die Eigenschaftsname-Wertpaare aus einer Datenbank einliest und diese dann in Felder einspeisen kann, die zu anderen Beans gehören.

Antwort

6

Ansatz # 1:

Eine Möglichkeit ist ein Aspekt, mit einem Punkt-cut Ausdruck zu erzeugen, die eine beliebige Methode, um diese Annotation mit einstimmt.

Ihr Aspekt wird dann:

  • den Eigenschaftswert in der Anmerkung lesen
  • den gewünschten Wert ein inject es in die Klasse nachschlagen.

AOP Kickstart

Hier ist ein Leitfaden für die ersten Schritte mit AOP im Frühjahr

http://www.tutorialspoint.com/spring/aop_with_spring.htm

Joinpoint passend

Hier ist eine Referenz, die beschreibt, wie einen Join-Punkt, auf Anmerkungen Spiele erstellen: http://eclipse.org/aspectj/doc/next/adk15notebook/annotations-pointcuts-and-advice.html

Ansatz # 2:

Eine andere Möglichkeit, ein BeanFactoryPostProcessor verwenden - das ist im Wesentlichen, wie ein PropertyPlaceholderConfigurer funktioniert.

  • Es wird Ihre Bean-Definitionen betrachten und die zugrunde liegende Klasse abrufen.
  • Es wird dann nach der Anmerkung in der Klasse mit Reflexion suchen.
  • Es aktualisiert die Bean-Definition so, dass die Eigenschaft gemäß dem Wert in die Annotation eingefügt wird.

. . tatsächlich denke ich, Ansatz Nr. 2 klingt mehr nach dem, was Sie wollen - die gesamte Verarbeitung geschieht auf "Start-up". . . (In der Tat ändern Sie die Bohne Rezepte schon vor dem Start). . Wenn Sie jedoch AOP verwenden, würden Sie Methodenaufrufe abfangen, die für Sie zu spät sein könnten.

Namespace Handler

Wenn Sie wollten Sie könnten sogar Ihre eigenen Frühling Namespace-Handler schalten Sie den Postprozessor in einer prägnanten Art und Weise erstellen.ZB:

<myApp:injectFromDb /> 

als Alternative zu:

<bean class="MyDatabaseLookupProcessorImpl etc, etc. /> 

Update: Ansatz # 3

Ab Frühling 3.1 gibt es auch die PropertySourcesPlaceholderConfigurer, die für Sie die meisten der Sanitär bieten wird , damit Sie dies mit weniger Code erreichen können.

+1

Ich denke, Dies ist eine weitere Option: Verwenden Sie Spring 3.1 PropertySourcesPlaceholderConfigurer und fügen Sie eine neue PropertySource für meine Datenbankeigenschaften hinzu: http://spring.io/blog/2011/02/15/spring-3-1-m1-unified-property-management/ – DarVar

0

Alternativ sollten Sie in der Lage sein, eine Art von Eigenschaften-Repository-Bean zu konfigurieren und sie dann in SpEL direkt in @Value Annotation zu verwenden.

Sagen wir, Sie Bohne propertiesRepository in Ihrem Kontext genannt würde, die folgende Schnittstelle implementiert:

interface PropertiesRepository { 
    String getProperty(String propertyName); 
} 

dann auf Bohne, wo Sie Werte injizieren wollen Sie den folgenden Ausdruck verwenden können

@Value("#{propertiesRepository.getProperty('my.property')}") 
String myProperty; 
Verwandte Themen