2013-10-11 67 views
5

我需要創建添加自定義註釋像自定義註釋像@Value

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

然而,在我來說,我需要從一個數據庫中的值而不是屬性文件的方法。

基本上我想在容器啓動時創建一個bean,它從數據庫中讀取屬性名稱值對,然後可以將這些注入到屬於其他bean的字段中。

回答

6

方法#1:

的一種方式是創建一個方面,與匹配具有該註解的任何方法的一個點切割的表達。

你Aspect將則:

  • 讀取屬性值的標註
  • 查找所需的值其注入類。

AOP的Kickstart

這裏有一個指南開始使用AOP在Spring

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

連接點匹配

下面是介紹如何創建上標註匹配的連接點參考:http://eclipse.org/aspectj/doc/next/adk15notebook/annotations-pointcuts-and-advice.html

方法2:

另一種方法是使用BeanFactoryPostProcessor - 這基本上是提供一個PropertyPlaceholderConfigurer是如何工作的。

  • 它會查看您的bean定義並獲取基礎類。
  • 然後,它將使用反射來檢查課程中的註釋。
  • 它將更新bean定義以包含按照註釋中的值注入屬性。

。 。實際上,我認爲方法2聽起來更像你想要的 - 所有的處理都是在「啓動」時發生的。 。 。 (實際上,甚至在啓動之前修改bean食譜)。 。而如果您使用AOP,則會攔截方法調用,這對您來說可能太遲了?

命名空間處理器

如果你想你甚至可以創建自己的春天命名空間處理器以簡潔的方式來打開你的後處理器。例如:

<myApp:injectFromDb /> 

來替代:

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

更新:方法3

由於Spring 3.1另外還有PropertySourcesPlaceholderConfigurer的,這將提供大部分管道的你,所以你可以用更少的代碼實現這一點。

+1

我猜這是另一種選擇:使用Spring 3.1 PropertySourcesPlaceholderConfigurer併爲我的數據庫屬性添加一個新的PropertySource:http://spring.io/blog/2011/02/15/spring-3-1-m1-unified-property-management/ – DarVar

0

或者,您應該能夠配置種類屬性存儲庫bean,然後直接在@Value註釋中將其用於SpEL。

比方說,你有豆中調用的情況下propertiesRepository實現以下接口:

interface PropertiesRepository { 
    String getProperty(String propertyName); 
} 
上豆

然後要注入可以使用值以下表達式

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