2010-08-31 11 views
8

:nasıl İlkbahar çerçevesini kullanarak harita içine mülk dosyadan değerleri alınır? şimdi mülk dosyalarından değerleri enjekte edebilir İçin

@Value("${aaa.prop}") 
public String someProp; 

Ama bir şey daha istiyorum ... Bir özellik dosyası var Örneğin

:

aaa.props=p1,p2,p3 
aaa.props.p1=qwe 
aaa.props.p2=asd 
aaa.props.p3=zxc 

ben biliyorum emin, bu özelliği aaa.props içerir ve bu diğer özellikleri hakkında hiçbir şey bilmiyorlar. Ve böyle kod kullanarak haritaya bu özelliklerini almak istiyorum:

@Value ("${aaa.props}") 
public Map<String, String> someProps; 

Ortaya someProps: {p1=qwe,p2=asd,p3=zxc}

+0

Sen kullanışlı bu soruya cevap bulabilirsiniz: http://stackoverflow.com/questions/9259819/how-to-read- özellik-değerleri-dosya. Özellikler nesnesini kaynak olarak enjekte edin, listeyi ayrıştırın ve haritanızı buna göre oluşturun. – mrembisz

cevap

2

ben bunu yapamazsınız korkuyorum doğrudan. Ama

  • ApplicationContextAware uygulamak ve fasulye bir alan olarak ApplicationContext ayarlayabilirsiniz. (Başka bir harita filtreleyerek bir harita oluşturur fabrika fasulye: Bir @PostConstruct yöntem çağrısında
  • context.getBean("${aaa.props}")
+0

İhtiyacım olanları bulmak için tüm özellikleri elde etmenin bir yolu var mı? –

5

Eh Senin için bir jenerik bir yaklaşım inşa elle sonucu ayrıştırmak ve istenen alanlara ayarlayın özelliklerin hepsi bir tür haritadır. Bir test sınıfı burada

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> 

    <!-- use System.getProperties() as input --> 
    <bean class="spring.test.FilteredMapFactoryBean" id="javaMap"> 
     <property name="keyFilterPrefix" value="java." /> 
     <property name="input" value="#{T(java.lang.System).getProperties()}" /> 
    </bean> 

    <!-- use custom properties as input --> 
    <bean class="spring.test.FilteredMapFactoryBean" id="customMap"> 
     <property name="keyFilterPrefix" value="hello" /> 
     <property name="input"> 
      <props> 
       <prop key="hello">Is it me you're looking for?</prop> 
       <prop key="hello.again">Just called to say: hello.</prop> 
       <prop key="hello.goodby">You say goodbye and I say hello</prop> 
       <prop key="goodbye.blue.sky">Did-did-did-did-you hear the falling bombs?</prop> 
       <prop key="goodbye.ruby.tuesday">Who could hang a name on you?</prop> 
      </props> 
     </property> 
    </bean> 

</beans> 

Ve edilir: Burada

public class FilteredMapFactoryBean<V> extends 
    AbstractFactoryBean<Map<String, V>>{ 

    private Map<String, V> input; 

    /** 
    * Set the input map. 
    */ 
    public void setInput(final Map<String, V> input){ 
     this.input = input; 
    } 

    /** 
    * Set the string by which key prefixes will be filtered. 
    */ 
    public void setKeyFilterPrefix(final String keyFilterPrefix){ 
     this.entryFilter = new EntryFilter<String, V>(){ 

      @Override 
      public boolean accept(final Entry<String, V> entry){ 
       return entry.getKey().startsWith(keyFilterPrefix); 
      } 
     }; 
    } 

    public static interface EntryFilter<EK, EV> { 

     boolean accept(Map.Entry<EK, EV> entry); 
    } 

    /** 
    * If a prefix is not enough, you can supply a custom filter. 
    */ 
    public void setEntryFilter(final EntryFilter<String, V> entryFilter){ 
     this.entryFilter = entryFilter; 
    } 

    private EntryFilter<String, V> entryFilter; 

    /** 
    * {@inheritDoc} 
    */ 
    @Override 
    public Class<?> getObjectType(){ 
     return Map.class; 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    @Override 
    protected Map<String, V> createInstance() throws Exception{ 
     final Map<String, V> map = new LinkedHashMap<String, V>(); 
     for(final Entry<String, V> entry : this.input.entrySet()){ 
      if(this.entryFilter == null || this.entryFilter.accept(entry)){ 
       map.put(entry.getKey(), entry.getValue()); 
      } 
     } 
     return map; 
    } 

} 

bazı örnek kullanımı ile bir yay fasulye tanım dosyasıdır: Burada

fabrika Fasulye

public class Tester{ 

    @SuppressWarnings("unchecked") 
    public static void main(final String[] args){ 
     final ApplicationContext context = 
      new ClassPathXmlApplicationContext("classpath:spring/test/mapFactorybean.xml"); 

     final Map<String, String> javaMap = 
      (Map<String, String>) context.getBean("javaMap"); 
     print("java.", javaMap); 
     final Map<String, String> customMap = 
      (Map<String, String>) context.getBean("customMap"); 
     print("hello.", customMap); 

    } 

    private static void print(final String prefix, final Map<String, String> map){ 
     System.out.println("Map of items starting with " + prefix); 
     for(final Entry<String, String> entry : map.entrySet()){ 
      System.out.println("\t" + entry.getKey() + ":" + entry.getValue()); 
     } 
     System.out.println(""); 
    } 

} 

çıktı olarak beklenir:

Maven bağımlılık

<dependency> 
     <groupId>javax.annotation</groupId> 
     <artifactId>javax.annotation-api</artifactId> 
     <version>1.2</version> 
    </dependency> 

ithalat ekleyin: 210

Map of items starting with java. 
    java.runtime.name:Java(TM) SE Runtime Environment 
    java.vm.version:14.2-b01 
    java.vm.vendor:Sun Microsystems Inc. 
    java.vendor.url:http://java.sun.com/ 
    java.vm.name:Java HotSpot(TM) Client VM 
    java.vm.specification.name:Java Virtual Machine Specification 
    java.runtime.version:1.6.0_16-b01 
    java.awt.graphicsenv:sun.awt.Win32GraphicsEnvironment 
     [... etc] 

Map of items starting with hello. 
    hello.goodby:You say goodbye and I say hello 
    hello:Is it me you're looking for? 
    hello.again:Just called to say: hello. 
+0

'AbstractFactoryBean', varsayılan olarak tekildir. Bu fasulye bir bağlamda birkaç kez (farklı özelliklerle) kullanmak sorun olmaz mı? – naXa

+0

@naXa bu cevap 4 yaşında. Bu günlerde FactoryBeans, kullanımdan kaldırılmıştır. \ @Configuration sınıfları yerine –

0

Böyle bir şey yapabilirdi. bahar xml uygulama bağlamında

import javax.annotation.Resource; 

...

@Resource (name="propertiesMapName") 
public Properties someProps; 

: Eğer @Value kullanabilirsiniz Bu ad

xmlns:util="http://www.springframework.org/schema/util" 

http://www.springframework.org/schema/util 
http://www.springframework.org/schema/util/spring-util-3.1.xsd 
+0

ile giderdim, neden çözümde -1 tane olduğunu anlayabilir miyim? Bu çalışır ve bence oldukça temiz bir yol, neyin yanlış olduğunu anlamak istiyorum. Teşekkürler – cralfaro

1

gerekecektir

<util:properties id="propertiesMapName" location="classpath:yourFile.properties"/> 

.

Özellikleri dosyası:

aaa.props={p1:'qwe',p2:'asd',p3:'zxc'} 

Java kodunu:

@Value("#{${aaa.props}}") 
private Map<String,String> someProps; 
+0

Cevap olarak kabul edilmeli ve kabul edilmeli. Ayrıca, Spring XML tabanlı konfigürasyonunu kullananlar, bunu “p: someProps =” # {$ {aaa.props}} '' gibi özellikleri kullanarak basitçe enjekte edebilirler. –

İlgili konular