Comment lire les valeurs du fichier de propriétés?

J'utilise le printemps. J'ai besoin de lire les valeurs du fichier de propriétés. Il s'agit d'un fichier de propriétés internes et non d'un fichier de propriétés externes. Fichier de propriétés peut être comme ci-dessous.

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

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

J'ai besoin de lire ces valeurs à partir du fichier de propriétés Pas de manière traditionnelle. Comment faire? Existe-t-il une dernière approche avec spring 3.0?

104
demandé sur ROMANIA_engineer 2012-02-13 15:38:33

8 réponses

Configurez PropertyPlaceholder dans votre contexte:

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

Ensuite, vous vous référez aux propriétés de vos haricots:

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

EDIT: mise à jour du code pour analyser la propriété avec des valeurs séparées par des virgules multiples:

my.property.name=aaa,bbb,ccc

Si cela ne fonctionne pas, vous pouvez définir un bean avec des propriétés, l'injecter et le traiter manuellement:

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

Et le haricot:

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

  @PostConstruct
  public void init() {
    // do whatever you need with properties
  }
}
174
répondu mrembisz 2013-03-26 16:10:54

Dans la classe de configuration

@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;
   }
}
35
répondu mokshino 2013-04-17 13:36:29

Il existe différentes façons d'atteindre la même chose,ci-dessous sont quelques moyens couramment utilisés au printemps -

  1. Utiliser PropertyPlaceholderConfigurer
  2. Utiliser PropertySource
  3. Utilisation De ResourceBundleMessageSource
  4. À L'Aide De PropertiesFactoryBean

    Et beaucoup plus........................

en supposant que ds.type est la clé dans votre fichier de propriété.


À l'Aide de PropertyPlaceholderConfigurer

Registre PropertyPlaceholderConfigurer bean -

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

Ou

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

Ou

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

Après avoir enregistré PropertySourcesPlaceholderConfigurer, Vous pouvez maintenant accéder à value -

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

À l'Aide de PropertySource

Dans la dernière version de printemps pas besoin de s'inscrire PropertyPlaceHolderConfigurer avec @PropertySource, j'ai trouvé un bon lien pour comprendre la compatibilité de la version -

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

À l'Aide de ResourceBundleMessageSource

Registre Bean -

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

Accès Valeur -

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

Ou

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

À l'Aide de PropertiesFactoryBean

Registre Bean -

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

Fil propriétés instance dans votre classe -

@Component
public class BeanTester {
    @Autowired Properties properties; 
    public void execute(){
        String attr = properties.getProperty("ds.type");
    }
}
27
répondu 2017-08-04 12:14:33

Voici une réponse supplémentaire qui m'a également beaucoup aidé à comprendre comment cela a fonctionné: http://www.javacodegeeks.com/2013/07/spring-bean-and-propertyplaceholderconfigurer.html

Tous les beans BeanFactoryPostProcessor doivent être déclarés avec unstatique , modificateur

@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();
 }
}
25
répondu Michael Tecourt 2013-08-21 07:29:02

Vous devez placer un bean PropertyPlaceholderConfigurer dans votre contexte d'application et définir sa propriété location.

Voir les détails ici: http://www.zparacha.com/how-to-read-properties-file-in-spring/

Vous devrez peut-être modifier un peu votre fichier de propriétés pour que cette chose fonctionne.

J'espère que ça aide.

6
répondu instanceOfObject 2012-02-13 11:41:31

Si vous devez lire manuellement un fichier de propriétés sans utiliser @Value.

Merci pour la page bien écrite par Lokesh Gupta: Blog

entrez la description de l'image ici

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;
    }
}
2
répondu John 2018-03-24 18:32:22
 [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>
0
répondu Sangram Badi 2016-08-26 10:34:18

Je vous recommande de lire ce lien https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html de SpringBoot docs sur l'injection de configs externes. Ils n'ont pas seulement parlé de la récupération à partir d'un fichier de propriétés, mais aussi des fichiers YAML et même JSON. Je l'ai trouvé utile. J'espère que vous aussi.

0
répondu Josh Uzo 2018-04-03 06:34:21