2011-08-28 168 views
29

如果我有2個.properties文件安裝在我的Spring XML像這樣:春天的Util:通過註釋屬性注入一個bean

<util:properties id="serverProperties" location="file:./applications/MyApplication/server.properties"/> 
<util:properties id="someConfig" location="file:./applications/MyApplication/config.properties"/> 

如何通過註解注入這些屬性文件與java.util.Properties豆?

如何通過Spring註釋獲取特定的屬性?

乾杯!

回答

44
@Autowired 
@Qualifier("serverProperties") 
private Properties serverProperties; 
@Autowired 
@Qualifier("someConfig") 
private Properties otherProperties; 

@Resource(name = "serverProperties") 
private Properties serverProperties; 
@Resource(name = "someConfig") 
private Properties otherProperties; 

通常,@Autowired用於通過型自動裝配在Spring和@Resource用於按姓名。 @ Autowired + @ Qualifier可以加倍使用名義自動裝配,但它的確適用於具有fine-tune the type能力的自動裝配。

+0

感謝您的信息和代碼示例! Works – NightWolf

2

您可以使用@PropertySource

@Configuration 
@PropertySource(name = "someName", value = {"classpath:a.properties", "classpath:b.properties"}) 
public class MyConfiguration { 
} 
+0

這很好,它完全消除了對XML配置的需求。 – bluecollarcoder

15

由於這個問題有很多次。我認爲使用SpEL(Spring表達式語言)指出另一個選項是值得的 - 如果您需要特定的屬性,可以使用特定的bean屬性上的@Value註釋來注入它們;

class SomeClass { 
    @Value("#{serverProperties['com.svr.prop']}") 
    private String aServerCfgProperty; 

    @Value("#{someConfig['another.config.setting']}") 
    private String someOtherProperty; 
} 

你不需要使用索引語法['index.val']你可以直接獲取它;

@Value("#{someConfig}") 
private Properties someConfig 

@Value("#{serverProperties}") 
private Properties svrProps; 

我發現這很實用,並且使用通過@Resource/@ Autowired直接注入的屬性對象。

使用帶索引Properties對象的@Value的另一個好理由是,如果項目中的.properties文件很好,某些IDE(例如IntelliJ)可以重構實際的屬性名稱。另一個技巧是使用類似EProperties(它擴展了本地Java屬性對象),如果你想在屬性文件中進行包含/嵌套/替換,而不使用Spring的PropertiesPlaceholderConfigurer類(可悲的是不公開它的屬性 - 使用SpEL索引['key'] bean需要成爲Map<>的一個實例,即Java屬性對象所做的擴展映射)...

最後,SpEL的另一個很好的特性是可以直接訪問bean的屬性。因此,舉例來說,如果上述示例中的SomeClass是Spring bean,例如someClass然後在AnotherBeanClass中我們可以有;

@Value("#{someClass.someOtherProperty}") 
private String injectedBeanProp 

你也可以調用一個getter方法:

@Value("#{someClass.getSomeOtherProperty()}") 
private String injectedBeanProp 

看到這裏的規劃環境地政司指導; http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#expressions

+1

只是一個說明SpEL在春季3+ – NightWolf

+0

更多在這裏; http://blog.nemccarthy.me/?p=304 – NightWolf

+0

我只是獲得@Value註釋的空值! –

0

大部分時間我將所有屬性封裝到一個實用程序中,並在我的應用程序中使用。這樣你就不用擔心/管理應用層中的每個屬性文件。 Autowired setProps(...)會讀取您加載的所有util:屬性道具列表。

import java.util.List; 
import java.util.Properties; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Component; 

@Component 
public class AppProperiesProcessor { 

private List<Properties> props; 
private Properties mergedProperties; 

@Autowired 
public final void setProps(List<Properties> props) { 
    this.props = props; 
} 

public String getProp(final String keyVal) { 

    if (null == this.mergedProperties) { 
     this.mergedProperties = new Properties(); 

     for (Properties prop : this.props) { 
      this.mergedProperties.putAll(prop); 
     } 
    } 
    return mergedProperties.getProperty(keyVal); 
    } 
} 
1

XML文件

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:mvc="http://www.springframework.org/schema/mvc" 
xmlns:util="http://www.springframework.org/schema/util" 
xsi:schemaLocation=" 
http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-4.0.xsd 
http://www.springframework.org/schema/mvc 
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd 
http://www.springframework.org/schema/util 
http://www.springframework.org/schema/util/spring-util-4.0.xsd"> 
    <context:component-scan base-package="com.sha.home" /> 
    <mvc:annotation-driven/> 
    <util:properties id="dbProp" location="classpath:db.properties" /> 
    <!-- <context:property-placeholder location="classpath:db.properties"/> --> 

</beans> 
在Java文件 @Value( 「#{} DBPROP」) 私人性質dbProperties

; System.out.println(「urllll」+ dbProperties.getProperty(「jdbc.url」));