Як читати значення з файлу властивостей?


133

Я використовую весну. Мені потрібно прочитати значення з файлу властивостей. Це файл внутрішніх властивостей, а не файл зовнішніх властивостей. Файл властивостей може бути, як показано нижче.

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

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

Мені потрібно читати ці значення з файлу властивостей не традиційним чином. Як цього досягти? Чи є останній підхід із весною 3.0?


7
Це не схоже на файл властивостей .
Рагурам

Якщо це файл властивостей у сенсі Java - так. В іншому випадку це спеціальний формат файлу, до якого потрібно ставитися по-різному (і ви не можете просто використовувати рядки як значення властивостей навесні, якщо у них немає ключа).
Хоуке Інгмар Шмідт

3
"Не традиційним чином" - що ви розумієте під цим?
Хоуке Інгмар Шмідт

я маю на увазі використання анотацій .. не за допомогою конфігурації xml ...
user1016403

Відповіді:


196

Налаштуйте PropertyPlaceholder у своєму контексті:

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

Потім ви посилаєтесь на властивості вашої квасолі:

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

EDIT: оновлено код для розбору властивостей із змішаними комами значеннями:

my.property.name=aaa,bbb,ccc

Якщо це не працює, ви можете визначити бін із властивостями, ввести та обробити його вручну:

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

і квасоля:

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

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

Привіт mrembisz, Дякую за Вашу відповідь. Я вже налаштував propert-placeholder для зчитування значень із зовнішніх файлів властивостей. але у мене є один файл властивостей всередині папки ресурсів. мені потрібно читати і вводити. мені потрібно ввести всі значення в список. Дякую!
користувач1016403

Відредаговано за пропозицією @Ethan. Дякуємо за оновлення, не вдалося прийняти оригінальне редагування, вже було пізно.
mrembisz

2
Для випадку , коли ви маєте справу з роздільниками - комами , можливо , вважають , що тут пропонується, використовуючи EL: stackoverflow.com/questions/12576156 / ...
arcseldon

2
Як ми користуємося aaa? Це @Value(${aaa}) private String aaa;тоді ми можемо System.out.println(aaa)???????

2
@ user75782131 Точніше @Value("${aaa}"), пам’ятайте про цитати. І так, ви можете надрукувати його, за винятком того, що не в конструкторі, оскільки конструктор виконується до введення значень.
mrembisz

48

Існують різні способи досягнення того ж. Нижче наведено деякі часто використовувані способи навесні-

  1. Використання PropertyPlaceholderConfigurer

  2. Використання PropertySource

  3. Використання ResourceBundleMessageSource

  4. Використання PropertiesFactoryBean

    і багато іншого........................

Припущення ds.typeє ключовим у вашому файлі власності.


Використання PropertyPlaceholderConfigurer

Зареєструвати PropertyPlaceholderConfigurerbean-

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

або

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

або

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

Після реєстрації PropertySourcesPlaceholderConfigurerви можете отримати доступ до значення-

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

Використання PropertySource

В останній весняної версії вам не потрібно реєструватися PropertyPlaceHolderConfigurerз @PropertySource, я знайшов гарну посилання , щоб зрозуміти версію compatibility-

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

Використання ResourceBundleMessageSource

Зареєструвати Bean-

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

Значення доступу

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

або

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

Використання PropertiesFactoryBean

Зареєструвати Bean-

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

Екземпляр проводних властивостей у ваш клас-

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

Щоб використовувати PropertySourcesPlaceholderConfigurer, вам зазвичай потрібно встановити місцеположення чи ресурс, інакше ви не мали доступу до файлу властивостей. Ви можете використовувати, наприклад, ClassPathResource generalProperties = новий ClassPathResource ("general.properties");
M46

43

У класі конфігурації

@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;
   }
}

У цьому прикладі ви просто використаєте інше app.propertiesу виробництві v. Тестування? Іншими словами, чи буде частина вашого процесу розгортання заміною app.propertiesвиробничих цінностей?
Кевін Мередіт

1
@KevinMeredith так, ви можете просто розділити конфігурацію пружини профільної анотації stackoverflow.com/questions/12691812 / ...
Мокшіно

@KevinMeredith ми використовуємо папку поза війною розгортання: як c: \ apps \ sys_name \ conf \ app.properties. Процес розгортання стає спрощеним та менш схильним до помилок.
jpfreire

27

Ось додаткова відповідь, яка також допомогла мені зрозуміти, як це працює: http://www.javacodegeeks.com/2013/07/spring-bean-and-propertyplaceholderconfigurer.html

будь-які боби BeanFactoryPostProcessor повинні бути оголошені статичним модифікатором

@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();
 }
}

Не потрібно чітко реєструвати PropertySourcesPlaceholderConfigurerBean у@PropertySource

@ dubey-theHarcourtians, яку весняну (основну) версію ви використовуєте? якщо ви використовуєте Spring Boot, вам навіть @PropertySourceвзагалі не потрібно .
Майкл Текур

11

Якщо вам потрібно вручну прочитати файл властивостей, не використовуючи @Value.

Дякуємо за добре написану сторінку Локеш Гупта: Блог

введіть тут опис зображення

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;
    }
}

Дякую, це працює на мій випадок. Мені потрібно прочитати властивості зі статичної функції.
Trieu Nguyen

6

Потрібно помістити бонус PropertyPlaceholderConfigurer у контекст програми та встановити його властивість розташування.

Деталі див. Тут: http://www.zparacha.com/how-to-read-properties-file-in-spring/

Можливо, вам доведеться трохи змінити файл власності, щоб ця справа працювала.

Сподіваюся, це допомагає.


4

Інший спосіб - використання ResourceBundle . В основному ви отримуєте пакет, використовуючи його ім'я без '. Властивостей'

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

І ви відновите будь-яке значення за допомогою цього:

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>

додайте трохи пояснень
HaveNoDisplayName

за допомогою основного контейнера ви не можете отримати доступ до файлу властивостей за межами ресурсу, тому вам потрібно використовувати контейнер j2ee, наприклад ApplicationContext, і вам потрібно перевірити рівень бобів, як xmlns, xmlns: util, xsi: schemaLocation, xmlns: xsi
Badi,

0

Я рекомендую прочитати це посилання https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html з Документів SpringBoot про введення зовнішніх конфігурацій. Вони говорили не лише про отримання файлу властивостей, але й YAML та навіть файли JSON. Я вважаю це корисним. Я сподіваюся, що ви теж зробите.


0

Я хотів клас корисності, яким не керує весна, тому немає весняних анотацій, наприклад @Component, @Configurationтощо. Але я хотів, щоб клас читав ізapplication.properties

Мені вдалося змусити його працювати, змусивши клас усвідомити Весняний контекст, отже, він усвідомлює Environmentі, отжеenvironment.getProperty() працює так, як очікувалося.

Щоб бути ясним, у мене є:

застосування.властивості

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 (див. Весна отримати поточний ApplicationContext )

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);
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.