2013-10-11 15 views
5

ho bisogno di creare un mezzo per aggiungere un'annotazione personalizzato comeannotazioni personalizzate come @Value

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

Tuttavia, nel mio caso ho bisogno di ottenere il valore da un database piuttosto che un file di proprietà.

Fondamentalmente vorrei creare un bean all'avvio del contenitore che legge le coppie di valori nome proprietà da un database e può quindi inserirle in campi appartenenti ad altri bean.

risposta

6

Approccio # 1:

Un modo è quello di creare un Aspetto, con un'espressione taglio a punto che corrisponde a qualsiasi metodo avente questa annotazione.

tuo aspetto sarà quindi:

  • Leggere il valore della proprietà nella annotazione
  • Cercare il valore richiesto un iniettarlo nella classe.

AOP Kickstart

Ecco una guida per iniziare a lavorare con AOP nella primavera

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

Joinpoint corrispondenza

Ecco un riferimento che descrive come creare un join-punto che corrisponde a annotazioni: http://eclipse.org/aspectj/doc/next/adk15notebook/annotations-pointcuts-and-advice.html

Approccio # 2:

Un altro modo è quello di utilizzare un BeanFactoryPostProcessor - questo è essenzialmente come funziona una PropertyPlaceholderConfigurer.

  • Analizzerà le definizioni dei bean e recupererà la classe sottostante.
  • Verificherà quindi l'annotazione nella classe, utilizzando la riflessione.
  • Aggiornare la definizione del bean per includere l'iniezione della proprietà secondo il valore nell'annotazione.

. . in realtà penso che l'approccio # 2 assomigli più a quello che vuoi - tutta l'elaborazione avviene sullo "start-up". . . (In realtà modificando le ricette dei fagioli prima dell'avvio). . mentre se hai utilizzato AOP, intercetti le invocazioni del metodo, che potrebbero essere troppo tardi per te?

Namespace Handler

Se si volesse si potrebbe anche creare il proprio Primavera gestore namespace per accendere il post processore in maniera concisa.Ad esempio:

<myApp:injectFromDb /> 

come alternativa a:

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

Aggiornamento: Approccio # 3

partire dalla primavera 3.1 c'è anche la PropertySourcesPlaceholderConfigurer, che fornirà la maggior parte delle tubature per voi , così puoi ottenerlo con meno codice.

+1

immagino questa è un'altra opzione: usa Spring 3.1 PropertySourcesPlaceholderConfigurer e aggiungi un nuovo PropertySource per le proprietà del mio database: http://spring.io/blog/2011/02/15/spring-3-1-m1-unified-property-management/ – DarVar

0

In alternativa si dovrebbe essere in grado di configurare il tipo di bean repository di proprietà e quindi utilizzarlo in SpEL direttamente nell'annotazione @Value.

Diciamo che avresti avuto fagiolo chiamato propertiesRepository nel vostro contesto che implementa seguente interfaccia:

interface PropertiesRepository { 
    String getProperty(String propertyName); 
} 

poi sul fagiolo in cui si desidera inserire valori che è possibile utilizzare seguente espressione

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