2015-02-03 15 views
18

Şu anda * .properties dosyalarını kullanan bir bahar uygulamasına sahibim ve bunun yerine YAML dosyalarını kullanmasını istiyorum.YBL dosyalarını Spring Framework 4.1 kullanarak yüklemek için YamlPropertiesFactoryBean nasıl kullanılır?

YamlPropertiesFactoryBean sınıfını, ihtiyacım olan şeyi yapabilecek durumda buluyorum.

Sorunum, bu sınıfı Spring uygulamasında nasıl kullanacağımı bilmiyorum (ek açıklama tabanlı yapılandırma kullanılarak). setBeanFactory yöntemiyle PropertySourcesPlaceholderConfigurer'da yapılandırmalıyım.

Daha önce ben yükleme oldu mülkiyet dosyaları aşağıdaki gibi @PropertySource kullanarak:

@Configuration 
@PropertySource("classpath:/default.properties") 
public class PropertiesConfig { 

    @Bean 
    public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() { 
     return new PropertySourcesPlaceholderConfigurer(); 
    } 
} 

nasıl PropertySourcesPlaceholderConfigurer içinde YamlPropertiesFactoryBean etkinleştirebilirsiniz ben YAML dosyalarını doğrudan yükleyebilir ve böylece? Yoksa bunu yapmanın başka bir yolu var mı?

Teşekkürler.

Uygulamam ek açıklama tabanlı bir yapılandırma kullanıyor ve Spring Framework 4.1.4 kullanıyorum. Bazı bilgiler buldum ama her zaman beni this one gibi Spring Boot'a işaret etti. XML yapılandırmayla

+0

Benim yorumum ilk sorunuzu cevaplıyorsa, kabul edebilir misiniz?Ya da ekleyebileceğim başka bir şey varsa, şimdi izin ver. – turtlesallthewaydown

+0

@turtlesallthewaydown Cevabınız için teşekkürler ve yanıttaki gecikme için özür dilerim. – ktulinho

cevap

44

bu yapıyı kullanıyorum: Elbette

<context:annotation-config/> 

<bean id="yamlProperties" class="org.springframework.beans.factory.config.YamlPropertiesFactoryBean"> 
    <property name="resources" value="classpath:test.yml"/> 
</bean> 

<context:property-placeholder properties-ref="yamlProperties"/> 

Eğer çalışma zamanı üzerinde sınıf snakeyaml bağımlılığı olması gerekir.

Java yapılandırması üzerinde XML yapılandırmasını tercih ediyorum, ancak yeniden dönüştürmenin zor olmamalı.

düzenleme: Bir sonraki yaklaşımı kullanabilirsiniz ilkbaharda .yml dosyasını okumak için bütünlüğü uğruna

@Bean 
public static PropertySourcesPlaceholderConfigurer properties() { 
    PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer(); 
    YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean(); 
    yaml.setResources(new ClassPathResource("default.yml")); 
    propertySourcesPlaceholderConfigurer.setProperties(yaml.getObject()); 
    return propertySourcesPlaceholderConfigurer; 
} 
+2

Cevabınız için teşekkürler. Şimdi, default.yml'den Java sınıfıma nasıl bir değer enjekte edebilirim? Yani, eğer ymlim bir özellik 'value: 60' içeriyorsa, bunu kodumda yapabilir miyim:' @Value ("$ {value}") özel String değeri; '? – ktulinho

+1

Normal .properties dosyasını kullanacağınız gibi yaml dosyasından yüklenen özellikleri kullanabilirsiniz. Bu nedenle, herhangi bir Bahar yönetimli sınıfında, gerçekten de @ @Value ("$ {value}") özel String değeri 'örneğinizi kullanabilirsiniz ve buna enjekte edilecektir. – turtlesallthewaydown

1

için
java yapılandırma.

section1: 
    key1: "value1" 
    key2: "value2" 
section2: 
    key1: "value1" 
    key2: "value2" 

Sonra 2 Java POJOs tanımlamak:

@Configuration 
@EnableConfigurationProperties 
@ConfigurationProperties(prefix = "section1") 
public class MyCustomSection1 { 
    private String key1; 
    private String key2; 

    // define setters and getters. 
} 

@Configuration 
@EnableConfigurationProperties 
@ConfigurationProperties(prefix = "section2") 
public class MyCustomSection1 { 
    private String key1; 
    private String key2; 

    // define setters and getters. 
} 

Artık bileşeninde bu fasulye autowire olabilir

Örneğin bu .yml dosyası var. Örneğin: durumunda

@Component 
public class MyPropertiesAggregator { 

    @Autowired 
    private MyCustomSection1 section; 
} 

Otomatik scaned ve örneği edilecektir Bahar Boot şeyi kullanıyor:

@SpringBootApplication 
public class MainBootApplication { 
    public static void main(String[] args) { 
     new SpringApplicationBuilder() 
      .sources(MainBootApplication.class) 
      .bannerMode(OFF) 
      .run(args); 
    } 
} 

you'are JUnit kullanılıyorsa yükleme YAML dosyası için bir temel test kurulumu vardır:

@SpringApplicationConfiguration(MainBootApplication.class) 
public abstract class BaseITTest extends AbstractTestNGSpringContextTests { 
    .... 
} 
: Eğer TestNG kullanıyorsanız
@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(MainBootApplication.class) 
public class MyJUnitTests { 
    ... 
} 

deneme konfigürasyonunun bir örnek vardır

+8

Üzgünüz, ama örneğiniz _Spring Boot_ ile ilgilidir. Soru şu: _plain_ Spring Framework 4.1 –

+1

@ayurchuk '.yaml'' HashMap' nesnesine nasıl okunur? – niaomingjian

+1

@ayurchuk Dosya adım 'myconfig.yaml'. Bu yöntem işe yaramıyor. Ne yapmalıyım? – niaomingjian