2014-04-20 34 views
3

我需要知道加載屬性文件的兩種方式之間的區別。差異上下文:屬性佔位符VS @Configuration @PropertySource classpathproperties

方法-1

<context:property-placeholder location="classpath:constants.properties"/> 

方法-2

<context:component-scan base-package="com.snippets.enterprise"/> 

package com.snippets.enterprise; 

@Configuration 
@PropertySource("classpath:/constants.properties") 
public class SpringConfig {} 

我看到方法有兩個鍵和值是可用的應用程序上下文加載時。 但

方法時,應用程序上下文是加載的屬性之一密鑰不可和它說

關鍵是找不到的。請讓我知道這兩種方法的區別。

  1. 當屬性文件與應用程序上下文一起加載時。

  2. 當屬性文件的鍵值在容器中初始化時。

+0

添加例外堆棧跟蹤你得到你的問題,你有哪些文件**方法1 **配置?命名你的項目中有什麼彈簧配置文件? – Rembo

回答

4

兩者實際上相當獨立。讓我試着根據我的理解進行澄清:

使用方法1註冊一個組件,它可以在bean定義中解析表格${propertyname}的佔位符。

@PropertySource註釋爲活動Spring environment貢獻屬性。

現在回到方法1,context:property-placeholder其實足夠聰明,知道它不僅需要查看通過其location屬性註冊的屬性,還需要查看當前活動環境中可用的屬性通過@PropertySource註釋添加了屬性,就像在您的方法中一樣)。

所以,如果你想讓你的佔位符繼續得到解決,你需要使用你的方法1和方法2。

如果你想使用方法2專門那麼另一方面,最好的辦法就是在你需要的屬性,明確查找財產,這樣的環境下注入:

@Component 
public class MyBean { 
    @Autowired 
    private Environment environment; 

    public void mymethod() { 
     .. 
     environment.getProperty("mykey"); 
    } 
} 
+0

謝謝。但是我無法使用Approach-1注入屬性密鑰。方法-2在哪裏製作。 \t \t \t <屬性名=」鍵」值=‘$ {的keyPath}’/> \t的keyPath是屬性文件的一個屬性,要注入它當上下文被加載。 – Kasun

+0

異常在線程‘主’ org.springframework.beans.factory.BeanDefinitionStoreException:在類路徑資源[applicationContext.xml]中定義名稱爲'helloWorldBean'的無效bean定義:無法解析佔位符'keypath' \t at org.springframework.beans.factory.config.PropertyPlaceholderConfigurer .processProperties(PropertyPlaceholderConfigurer.java:252) \t at org.springframework.beans.factory.config.PropertyResourceConfigurer.postProcessBeanFactory(PropertyResourceConfigurer.java:75) – Kasun

+0

但是,這與方法2 <屬性名稱=「key」value =「$ {keypath}」/> Kasun