2013-10-11 5 views
5

Je dois créer un moyen d'ajouter une annotation personnalisée commeannotation personnalisée comme @Value

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

Cependant, dans mon cas, je dois obtenir plutôt puis un fichier de propriétés de la valeur à partir d'une base de données. Fondamentalement, je voudrais créer un bean au démarrage du conteneur qui lit dans les paires de valeurs de nom de propriété d'une base de données et peut ensuite les injecter dans des champs appartenant à d'autres beans.

Répondre

6

Approche # 1:

Une façon est de créer un aspect, avec une expression point de coupe qui correspond à une méthode ayant cette annotation.

Votre aspect sera alors:

  • Lire la valeur de la propriété dans l'annotation
  • Recherchez la valeur nécessaire une injecter dans la classe.

AOP Kickstart

Voici un guide pour commencer avec AOP au printemps

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

Joinpoint correspondant

est ici une référence qui décrit comment créer une jointure point correspondant sur les annotations: http://eclipse.org/aspectj/doc/next/adk15notebook/annotations-pointcuts-and-advice.html

Approche # 2:

Une autre façon est d'utiliser un BeanFactoryPostProcessor - c'est essentiellement comment fonctionne PropertyPlaceholderConfigurer.

  • Il examinera vos définitions de beans et récupérera la classe sous-jacente.
  • Il vérifiera ensuite l'annotation dans la classe, en utilisant la réflexion.
  • Il mettra à jour la définition du bean pour inclure l'injection de la propriété selon la valeur de l'annotation.

. . En fait, je pense que l'approche # 2 ressemble plus à ce que vous voulez - tout le traitement se passe au démarrage. . . (En fait, vous modifiez les recettes de haricots avant même le démarrage). . alors que si vous utilisiez AOP, vous intercepteriez des invocations de méthodes, ce qui pourrait être trop tard pour vous?

Gestionnaire Namespace

Si vous voulez, vous pouvez même créer votre propre gestionnaire d'espace de noms Spring pour allumer votre post-processeur de manière laconique.Par exemple:

<myApp:injectFromDb /> 

comme alternative à:

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

Mise à jour: Approche # 3

Au printemps 3.1 il y a aussi le PropertySourcesPlaceholderConfigurer, qui fournira plus de la plomberie pour vous , donc vous pouvez réaliser ceci avec moins de code.

+1

Je suppose que C'est une autre option: Utilisez Spring 3.1 PropertySourcesPlaceholderConfigurer et ajoutez une nouvelle PropertySource pour les propriétés de ma base de données: http://spring.io/blog/2011/02/15/spring-3-1-m1-unified-property-management/ – DarVar

0

Vous pouvez également configurer le type de bean de référentiel de propriétés, puis l'utiliser dans SpEL directement dans l'annotation @Value.

Disons que vous auriez haricot appelé propertiesRepository dans votre contexte et qui suit l'interface:

interface PropertiesRepository { 
    String getProperty(String propertyName); 
} 

alors sur les haricots où vous voulez injecter des valeurs que vous pouvez utiliser l'expression suivante

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