Как читать значения из файла свойств?
Я использую весна. Мне нужно прочитать значения из файла свойств. Это внутренний файл свойств, а не внешний файл свойств. Свойства файла могут быть, как показано ниже.
some.properties ---file name. values are below.
abc = abc
def = dsd
ghi = weds
jil = sdd
Мне нужно прочитать эти значения из файла свойств не традиционным способом. Как этого добиться? Есть ли какой-либо последний подход с spring 3.0?
8 ответов:
настройка PropertyPlaceholder в вашем контексте:
<context:property-placeholder location="classpath*:my.properties"/>
затем вы ссылаетесь на свойства в ваших бобах:
@Component class MyClass { @Value("${my.property.name}") private String[] myValues; }
редактировать: обновлен код для разбора собственность с нескольких значений, разделенных запятыми:
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 } }
в конфигурации класса
@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; } }
существуют различные способы достижения того же,Ниже приведены некоторые общие используемые способы весной -
- Использование PropertyPlaceholderConfigurer
- Использование PropertySource
- Использование ResourceBundleMessageSource
Используя PropertiesFactoryBean
и много больше........................
предполагая, что
ds.type
является ключом в файле свойств.
используя
PropertyPlaceholderConfigurer
зарегистрироваться
PropertyPlaceholderConfigurer
bean -<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
,я нашел хороший ссылке чтобы понять совместимость версий -@PropertySource("classpath:path/filename.properties") @Component public class BeanTester { @Autowired Environment environment; public void execute(){ String attr = this.environment.getProperty("ds.type"); } }
используя
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>
Доступ К Стоимости-
((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
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>
экземпляр свойств провода в вас класс
@Component public class BeanTester { @Autowired Properties properties; public void execute(){ String attr = properties.getProperty("ds.type"); } }
вот дополнительный ответ, который также очень помог мне понять, как это работает: 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(); } }
необходимо поместить компонент PropertyPlaceholderConfigurer в контекст приложения и задать его свойство location.
подробности смотрите здесь:http://www.zparacha.com/how-to-read-properties-file-in-spring/
возможно, вам придется немного изменить файл свойств, чтобы эта вещь работала.
надеюсь, что это помогает.
Если вам нужно вручную прочитать файл свойств без использования @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; } }
[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>
Я рекомендую прочитать эту ссылку https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html из документов SpringBoot о введении внешних конфигураций. Они говорили не только о получении из файла свойств, но и о файлах YAML и даже JSON. Я нашел это полезным. Я тоже на это надеюсь.