2013-10-11 28 views
5

muszę stworzyć oznacza dodanie niestandardowego adnotacji jakniestandardowe adnotacji jak @Value

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

Jednak w moim przypadku trzeba uzyskać wartości z bazy danych, a następnie plik właściwości.

Zasadniczo chciałbym utworzyć komponent bean podczas uruchamiania kontenera, który odczytuje pary wartości właściwości z bazy danych i może następnie wprowadzić te wartości do pól należących do innych komponentów.

Odpowiedz

6

Podejście nr 1:

Jednym ze sposobów jest stworzenie aspekcie z wyrażeniem punkt-cut, który pasuje dowolną metodę mającą tej adnotacji.

Twój aspekt będzie wtedy:

  • Odczytać wartość nieruchomości w adnotacji
  • Spójrz wymaganą wartość jest wstrzyknąć do klasy.

AOP Kickstart

Oto przewodnik do rozpoczęcia korzystania z AOP w Spring

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

JoinPoint dopasowanie

Oto odniesienia, który opisuje sposób tworzenia join-punkt, który odpowiada na adnotacji: http://eclipse.org/aspectj/doc/next/adk15notebook/annotations-pointcuts-and-advice.html

Podejście # 2:

Innym sposobem jest użycie BeanFactoryPostProcessor - to w zasadzie jak PropertyPlaceholderConfigurer działa.

  • Spowoduje wyświetlenie definicji komponentów bean i pobranie podstawowej klasy.
  • Następnie sprawdzi adnotację w klasie, używając refleksji.
  • Zaktualizuje definicję komponentu bean tak, aby obejmowała wstrzykiwanie właściwości zgodnie z wartością w adnotacji.

. . właściwie myślę, że podejście nr 2 brzmi bardziej jak to, co chcesz - całe przetwarzanie odbywa się przy "uruchomieniu". . . (W rzeczywistości twoja modyfikacja receptur fasoli nawet przed uruchomieniem). . mając na uwadze, że jeśli używałbyś AOP, przechwytywałeś inwokacje metod, które mogą być dla ciebie za późno?

nazw Handler

Jeśli chciałeś można nawet tworzyć własne Wiosna namespace obsługi aby włączyć postprocesora w zwięzły sposób.Np:

<myApp:injectFromDb /> 

jako alternatywa dla:

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

Aktualizacja: Podejście nr 3

od wiosny 3.1 istnieje również PropertySourcesPlaceholderConfigurer, która zapewni większość kanalizacji dla Ciebie , dzięki czemu możesz osiągnąć to przy mniejszej ilości kodu.

+1

Chyba jest to kolejna opcja: Użyj Spring 3.1 PropertySourcesPlaceholderConfigurer i dodaj nowe PropertySource dla moich właściwości bazy danych: http://spring.io/blog/2011/02/15/spring-3-1-m1-unified-property-management/ – DarVar

0

Alternatywnie powinieneś być w stanie skonfigurować rodzaj fasoli repozytorium właściwości, a następnie użyć go w Spel bezpośrednio w adnotacji @Value.

Powiedzmy, że masz fasoli nazywa propertiesRepository w swoim kontekście, który implementuje następujący interfejs:

interface PropertiesRepository { 
    String getProperty(String propertyName); 
} 

następnie na fasoli, gdzie chcesz, aby wprowadzić wartości można użyć następującego wyrażenia

@Value("#{propertiesRepository.getProperty('my.property')}") 
String myProperty; 
Powiązane problemy