Özellikler dosyasından değerler nasıl okunur?


133

Yay kullanıyorum. Özellikler dosyasından değerleri okumam gerekiyor. Bu, harici özellikler dosyası değil dahili özellikler dosyasıdır. Özellikler dosyası aşağıdaki gibi olabilir.

some.properties ---file name. values are below.

abc = abc
def = dsd
ghi = weds
jil = sdd

Bu değerleri özellikler dosyasından geleneksel bir şekilde okumam gerekiyor. Nasıl başarılır? Spring 3.0 ile son bir yaklaşım var mı?


7
Bu bir özellikler dosyası gibi görünmüyor .
Raghuram

Java anlamında bir özellikler dosyasıysa - evet. Aksi takdirde, farklı ele alınması gereken özel bir dosya biçimidir (ve bir anahtarı yoksa satırları Spring'de özellik değerleri olarak kullanamazsınız).
Hauke ​​Ingmar Schmidt

3
"Geleneksel şekilde değil" - bununla ne demek istiyorsun?
Hauke ​​Ingmar Schmidt

ek açıklamaları kullanmak demek ... xml yapılandırmasıyla değil ...
user1016403

Yanıtlar:


196

PropertyPlaceholder'ı kendi bağlamınızda yapılandırın:

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

Sonra çekirdeklerinizdeki özelliklere bakarsınız:

@Component
class MyClass {
  @Value("${my.property.name}")
  private String[] myValues;
}

DÜZENLEME: kodu, özelliği virgülle ayrılmış birden çok değerle ayrıştırmak için güncelledi:

my.property.name=aaa,bbb,ccc

Bu işe yaramazsa, özelliklere sahip bir fasulye tanımlayabilir, manuel olarak enjekte edebilir ve işleyebilirsiniz:

<bean id="myProperties"
      class="org.springframework.beans.factory.config.PropertiesFactoryBean">
  <property name="locations">
    <list>
      <value>classpath*:my.properties</value>
    </list>
  </property>
</bean>

ve fasulye:

@Component
class MyClass {
  @Resource(name="myProperties")
  private Properties myProperties;

  @PostConstruct
  public void init() {
    // do whatever you need with properties
  }
}

Merhaba mrembisz, Cevabınız için teşekkürler. Harici özellikler dosyasından değerleri okumak için uygun yer tutucuyu zaten yapılandırdım. ancak kaynaklar klasörünün içinde bir özellikler dosyam var. Okumam ve enjekte etmem gerekiyor. tüm değerleri listeye eklemem gerekiyor. Teşekkürler!
user1016403

@Ethan tarafından önerildiği gibi düzenlendi. Güncelleme için teşekkürler, orijinal düzenlemeyi kabul edemedim, çok geçti.
mrembisz

2
Virgülle ayrılmış değerlerle uğraştığınız durumda, burada EL: stackoverflow.com/questions/12576156/…
arcseldon

2
Nasıl Kullanıyoruz aaa? O zaman @Value(${aaa}) private String aaa;yapabilir miyiz System.out.println(aaa)???????

2
@ user75782131 Daha doğrusu @Value("${aaa}"), alıntılara dikkat edin. Ve evet, yapıcıda olmadıkça yazdırabilirsiniz çünkü yapıcı değerler enjekte edilmeden önce çalıştırılır.
mrembisz

48

Aynı şeyi başarmanın çeşitli yolları vardır. Aşağıda baharda yaygın olarak kullanılan bazı yollar bulunmaktadır.

  1. PropertyPlaceholderConfigurer'ı kullanma

  2. PropertySource'u kullanma

  3. ResourceBundleMessageSource'u kullanma

  4. PropertiesFactoryBean'i kullanma

    ve daha fazlası........................

ds.typeMülk dosyanızın anahtarı olduğunu varsayarsak .


kullanma PropertyPlaceholderConfigurer

Kayıt PropertyPlaceholderConfigurerfasulyesi

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

veya

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="locations" value="classpath:path/filename.properties" ></property>
</bean>

veya

@Configuration
public class SampleConfig {
 @Bean
 public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer() {
  return new PropertySourcesPlaceholderConfigurer();
  //set locations as well.
 }
}

Kayıt olduktan sonra PropertySourcesPlaceholderConfigurer, değere erişebilirsiniz-

@Value("${ds.type}")private String attr; 

kullanma PropertySource

Son bahar sürümünde kayıt gerekmez PropertyPlaceHolderConfigurerile @PropertySource, iyi bir buldum linki versiyonu compatibility- anlamak

@PropertySource("classpath:path/filename.properties")
@Component
public class BeanTester {
    @Autowired Environment environment; 
    public void execute() {
        String attr = this.environment.getProperty("ds.type");
    }
}

kullanma ResourceBundleMessageSource

Bean adına kaydolun-

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
  <property name="basenames">
    <list>
      <value>classpath:path/filename.properties</value>
    </list>
  </property>
</bean>

Erişim Değeri

((ApplicationContext)context).getMessage("ds.type", null, null);

veya

@Component
public class BeanTester {
    @Autowired MessageSource messageSource; 
    public void execute() {
        String attr = this.messageSource.getMessage("ds.type", null, null);
    }
}

kullanma PropertiesFactoryBean

Bean adına kaydolun-

<bean id="properties"
      class="org.springframework.beans.factory.config.PropertiesFactoryBean">
  <property name="locations">
    <list>
      <value>classpath:path/filename.properties</value>
    </list>
  </property>
</bean>

Özellikler örneğini sınıfınıza bağlayın-

@Component
public class BeanTester {
    @Autowired Properties properties; 
    public void execute() {
        String attr = properties.getProperty("ds.type");
    }
}

PropertySourcesPlaceholderConfigurer'ı kullanmak için normalde bir konum veya kaynak ayarlamanız gerekir, aksi takdirde bir özellikler dosyasına erişemezsiniz. Örneğin; ClassPathResource generalProperties = new ClassPathResource ("general.properties");
M46

43

Konfigürasyon sınıfında

@Configuration
@PropertySource("classpath:/com/myco/app.properties")
public class AppConfig {
   @Autowired
   Environment env;

   @Bean
   public TestBean testBean() {
       TestBean testBean = new TestBean();
       testBean.setName(env.getProperty("testbean.name"));
       return testBean;
   }
}

Bu örnekte, app.propertiesüretim testinde farklı bir yöntem mi kullanırdınız? Başka bir deyişle, dağıtım sürecinizin bir parçası app.propertiesüretim değerleriyle değiştirmek mi olur?
Kevin Meredith

1
@KevinMeredith evet, yay konfigürasyonunuzu Profil ek açıklaması stackoverflow.com/questions/12691812/… ile
bölebilirsiniz

@KevinMeredith, savaşın dışında bir klasör kullanıyoruz: c: \ apps \ sys_name \ conf \ app.properties gibi. Dağıtım süreci basitleştirilir ve daha az hataya açık hale gelir.
jpfreire

27

Nasıl çalıştığını anlamam için bana çok yardımcı olan ek bir cevap: http://www.javacodegeeks.com/2013/07/spring-bean-and-propertyplaceholderconfigurer.html

Herhangi bir BeanFactoryPostProcessor fasulyesi statik , değiştirici ile bildirilmelidir.

@Configuration
@PropertySource("classpath:root/test.props")
public class SampleConfig {
 @Value("${test.prop}")
 private String attr;
 @Bean
 public SampleService sampleService() {
  return new SampleService(attr);
 }

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

Açıkça kayıt Gerek PropertySourcesPlaceholderConfigurerile Bean@PropertySource

@ dubey-theHarcourtians Hangi Yay (çekirdek) sürümünü kullanıyorsunuz? Spring Boot kullanıyorsanız @PropertySourcetamamen ihtiyacınız bile yok .
Michael Técourt

11

@ Değer kullanmadan bir özellikler dosyasını manuel olarak okumanız gerekiyorsa.

Lokesh Gupta'nın iyi yazılmış sayfası için teşekkürler: Blog

görüntü açıklamasını buraya girin

package utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.ResourceUtils;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.io.File;


public class Utils {

    private static final Logger LOGGER = LoggerFactory.getLogger(Utils.class.getName());

    public static Properties fetchProperties(){
        Properties properties = new Properties();
        try {
            File file = ResourceUtils.getFile("classpath:application.properties");
            InputStream in = new FileInputStream(file);
            properties.load(in);
        } catch (IOException e) {
            LOGGER.error(e.getMessage());
        }
        return properties;
    }
}

Teşekkürler, davam için çalışıyor. Özellikleri statik fonksiyondan okumam gerekiyor.
Trieu Nguyen


4

Başka bir yol da ResourceBundle kullanmaktır . Temel olarak paketi ".properties" olmadan adını kullanarak alırsınız.

private static final ResourceBundle resource = ResourceBundle.getBundle("config");

Ve bunu kullanarak herhangi bir değeri kurtarırsınız:

private final String prop = resource.getString("propName");

0
 [project structure]: http://i.stack.imgur.com/RAGX3.jpg
-------------------------------
    package beans;

        import java.util.Properties;
        import java.util.Set;

        public class PropertiesBeans {

            private Properties properties;

            public void setProperties(Properties properties) {
                this.properties = properties;
            }

            public void getProperty(){
                Set keys = properties.keySet();
                for (Object key : keys) {
                    System.out.println(key+" : "+properties.getProperty(key.toString()));
                }
            }

        }
    ----------------------------

        package beans;

        import org.springframework.context.ApplicationContext;
        import org.springframework.context.support.ClassPathXmlApplicationContext;

        public class Test {

            public static void main(String[] args) {
                // TODO Auto-generated method stub
                ApplicationContext ap = new ClassPathXmlApplicationContext("resource/spring.xml");
                PropertiesBeans p = (PropertiesBeans)ap.getBean("p");
                p.getProperty();
            }

        }
    ----------------------------

 - driver.properties

    Driver = com.mysql.jdbc.Driver
    url = jdbc:mysql://localhost:3306/test
    username = root
    password = root
    ----------------------------



     <beans xmlns="http://www.springframework.org/schema/beans"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:util="http://www.springframework.org/schema/util"
               xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">

            <bean id="p" class="beans.PropertiesBeans">
                <property name="properties">
                    <util:properties location="classpath:resource/driver.properties"/>
                </property>
            </bean>

        </beans>

biraz açıklama ekleyin
HaveNoDisplayName

xsi: util, xsi: schemaLocation, xmlns Eğer ApplicationContext gibi kullanım j2ee konteyner gerekiyor ve fasulye xmlns, xmlns gibi seviye doğrulama kullanmak gerekir öyleyse, değil erişim dışında kaynak özellikler dosyası can çekirdek kabı kullanarak
Sangram Badi


0

İlkbahar tarafından yönetilmeyen bir fayda sınıfı istedim, bu yüzden hiçbir bahar ek açıklaması yok @Component,@Configuration vb Ama okuma sınıfını istediapplication.properties

Sınıfın Bahar Bağlamından haberdar olmasını sağlayarak onu çalıştırmayı başardım, dolayısıyla farkında Environmentve dolayısıyla environment.getProperty()beklendiği gibi çalışıyor.

Açık olmak gerekirse:

application.properties

mypath=somestring

Utils.java

import org.springframework.core.env.Environment;

// No spring annotations here
public class Utils {
    public String execute(String cmd) {
        // Making the class Spring context aware
        ApplicationContextProvider appContext = new ApplicationContextProvider();
        Environment env = appContext.getApplicationContext().getEnvironment();

        // env.getProperty() works!!!
        System.out.println(env.getProperty("mypath")) 
    }
}

ApplicationContextProvider.java (bkz. Spring, geçerli ApplicationContext'i edinme )

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class ApplicationContextProvider implements ApplicationContextAware {
    private static ApplicationContext CONTEXT;

    public ApplicationContext getApplicationContext() {
        return CONTEXT;
    }

    public void setApplicationContext(ApplicationContext context) throws BeansException {
        CONTEXT = context;
    }

    public static Object getBean(String beanName) {
        return CONTEXT.getBean(beanName);
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.