Wie lese ich Werte aus der Eigenschaftendatei?

133

Ich benutze den Frühling. Ich muss Werte aus der Eigenschaftendatei lesen. Dies ist eine interne Eigenschaftendatei, nicht die externe Eigenschaftendatei. Die Eigenschaftendatei kann wie folgt aussehen.

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

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

Ich muss diese Werte nicht auf herkömmliche Weise aus der Eigenschaftendatei lesen. Wie erreicht man das? Gibt es einen neuesten Ansatz für Spring 3.0?

user1016403
quelle
7
Dies sieht nicht wie eine Eigenschaftendatei aus .
Raghuram
Wenn es sich um eine Eigenschaftendatei im Java-Sinne handelt - ja. Andernfalls handelt es sich um ein benutzerdefiniertes Dateiformat, das anders behandelt werden muss (und Sie können die Zeilen in Spring nicht einfach als Eigenschaftswerte verwenden, wenn sie keinen Schlüssel haben).
Hauke ​​Ingmar Schmidt
3
"Nicht auf traditionelle Weise" - was meinst du damit?
Hauke ​​Ingmar Schmidt
Ich meine mit Anmerkungen .. nicht durch XML-Konfiguration ...
user1016403

Antworten:

196

Konfigurieren Sie PropertyPlaceholder in Ihrem Kontext:

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

Dann beziehen Sie sich auf die Eigenschaften in Ihren Bohnen:

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

BEARBEITEN: Der Code wurde aktualisiert, um die Eigenschaft mit mehreren durch Kommas getrennten Werten zu analysieren:

my.property.name=aaa,bbb,ccc

Wenn dies nicht funktioniert, können Sie eine Bean mit Eigenschaften definieren, injizieren und manuell verarbeiten:

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

und die Bohne:

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

  @PostConstruct
  public void init() {
    // do whatever you need with properties
  }
}
mrembisz
quelle
Hallo mrembisz, danke für deine antwort. Ich habe den Property-Placeholder bereits so konfiguriert, dass er Werte aus einer externen Eigenschaftendatei liest. Aber ich habe eine Eigenschaftendatei im Ressourcenordner. Ich muss lesen und spritzen. Ich muss alle Werte in die Liste einfügen. Vielen Dank!
user1016403
Bearbeitet wie von @Ethan vorgeschlagen. Vielen Dank für das Update, konnte die ursprüngliche Bearbeitung nicht akzeptieren, es war bereits zu spät.
Mrembisz
2
Für den Fall, dass Sie mit durch Kommas getrennten Werten arbeiten, überlegen Sie sich vielleicht, was hier unter Verwendung von EL vorgeschlagen wird: stackoverflow.com/questions/12576156/…
arcseldon
2
Wie verwenden wir aaa? Ist es @Value(${aaa}) private String aaa;dann können wir System.out.println(aaa)???????
2
@ user75782131 Genauer gesagt @Value("${aaa}"), beachten Sie die Anführungszeichen. Und ja, Sie können es drucken, außer nicht im Konstruktor, da der Konstruktor ausgeführt wird, bevor Werte eingefügt werden.
Mrembisz
48

Es gibt verschiedene Möglichkeiten, dasselbe zu erreichen. Im Folgenden finden Sie einige häufig verwendete Methoden für den Frühling.

  1. Verwenden von PropertyPlaceholderConfigurer

  2. Verwenden von PropertySource

  3. Verwenden von ResourceBundleMessageSource

  4. Verwenden von PropertiesFactoryBean

    und viele mehr........................

Angenommen, es ds.typeist der Schlüssel in Ihrer Eigenschaftendatei.


Verwenden von PropertyPlaceholderConfigurer

Registrieren Sie PropertyPlaceholderConfigurerBean-

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

oder

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

oder

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

Nach der Registrierung PropertySourcesPlaceholderConfigurerkönnen Sie auf den Wert zugreifen.

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

Verwenden von PropertySource

In der neuesten Version Frühjahr müssen Sie sich nicht registrieren PropertyPlaceHolderConfigurermit @PropertySource, fand ich eine gute Link - Version Kompatibilität : zu verstehen ,

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

Verwenden von ResourceBundleMessageSource

Register Bean-

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

Zugriffswert-

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

oder

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

Verwenden von PropertiesFactoryBean

Register Bean-

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

Instanz von Wire Properties in Ihre Klasse

@Component
public class BeanTester {
    @Autowired Properties properties; 
    public void execute() {
        String attr = properties.getProperty("ds.type");
    }
}
Gemeinschaft
quelle
Um einen PropertySourcesPlaceholderConfigurer zu verwenden, müssen Sie normalerweise einen Speicherort oder eine Ressource festlegen, da Sie sonst nicht auf eine Eigenschaftendatei zugreifen können. Sie können zB ClassPathResource generalProperties = new ClassPathResource ("general.properties") verwenden;
M46
43

In der Konfigurationsklasse

@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;
   }
}
Mokshino
quelle
Würden Sie in diesem Beispiel app.propertiesin der Produktion einfach einen anderen Test verwenden? Mit anderen Worten, würde ein Teil Ihres Bereitstellungsprozesses darin bestehen, durch app.propertiesProduktionswerte zu ersetzen ?
Kevin Meredith
1
@ KevinMeredith Ja, Sie können, teilen Sie einfach Ihre Federkonfiguration durch Profilanmerkung stackoverflow.com/questions/12691812/…
mokshino
@ KevinMeredith verwenden wir einen Ordner außerhalb von Deployment War: wie c: \ apps \ sys_name \ conf \ app.properties. Der Bereitstellungsprozess wird vereinfacht und ist weniger fehleranfällig.
jpfreire
27

Hier ist eine zusätzliche Antwort, die mir auch sehr geholfen hat, die Funktionsweise zu verstehen: http://www.javacodegeeks.com/2013/07/spring-bean-and-propertyplaceholderconfigurer.html

Alle BeanFactoryPostProcessor-Beans müssen mit einem statischen Modifikator deklariert werden

@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();
 }
}
Michael Técourt
quelle
Keine Notwendigkeit, PropertySourcesPlaceholderConfigurerBean explizit mit@PropertySource
@ dubey-theHarcourtians Welche Spring (Core) -Version verwenden Sie? Wenn Sie Spring Boot verwenden, brauchen Sie nicht einmal alles @PropertySource.
Michael Técourt
11

Wenn Sie eine Eigenschaftendatei manuell lesen müssen, ohne @Value zu verwenden.

Vielen Dank für die gut geschriebene Seite von Lokesh Gupta: Blog

Geben Sie hier die Bildbeschreibung ein

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;
    }
}
John
quelle
Danke, es funktioniert für meinen Fall. Ich muss die Eigenschaften aus der statischen Funktion lesen.
Trieu Nguyen
6

Sie müssen eine PropertyPlaceholderConfigurer-Bean in Ihren Anwendungskontext einfügen und deren Positionseigenschaft festlegen.

Details finden Sie hier: http://www.zparacha.com/how-to-read-properties-file-in-spring/

Möglicherweise müssen Sie Ihre Eigenschaftendatei ein wenig ändern, damit dies funktioniert.

Ich hoffe es hilft.

instanceOfObject
quelle
4

Eine andere Möglichkeit ist die Verwendung eines ResourceBundle . Grundsätzlich erhalten Sie das Bundle mit seinem Namen ohne die '.properties'

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

Und Sie stellen jeden Wert wieder her:

private final String prop = resource.getString("propName");
Miluna
quelle
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>
Sangram Badi
quelle
füge eine Erklärung hinzu
HaveNoDisplayName
Wenn Sie den Kerncontainer verwenden, können Sie nicht auf die externe Ressourceneigenschaftendatei zugreifen. Daher müssen Sie den j2ee-Container wie ApplicationContext und die Validierung der Beans-Ebene wie xmlns, xmlns: util, xsi: schemaLocation, xmlns: xsi
Sangram Badi verwenden.
0

Ich wollte eine Utility - Klasse , die nicht durch die Feder geführt wird, so dass keine Feder Anmerkungen wie @Component, @Configurationetc. Aber ich die Klasse wollte zum Lesenapplication.properties

Ich habe es geschafft, es zum Laufen zu bringen, indem ich die Klasse dazu gebracht habe, sich des Frühlingskontexts bewusst zu werden, daher bewusst zu sein Environmentund daher environment.getProperty()wie erwartet zu arbeiten.

Um es explizit zu sagen, ich habe:

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 (siehe Spring, aktuellen ApplicationContext abrufen )

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);
    }
}
Sida Zhou
quelle