我正在使用春天。我需要从属性文件中读取值。这是内部属性文件而不是外部属性文件。属性文件可以如下所示。
some.properties ---file name. values are below.
abc = abc
def = dsd
ghi = weds
jil = sdd
我需要以传统方式从属性文件中读取这些值。怎么实现呢?有没有关于spring 3.0的最新方法?
答案 0 :(得分:182)
在您的上下文中配置PropertyPlaceholder:
<context:property-placeholder location="classpath*:my.properties"/>
然后引用bean中的属性:
@Component
class MyClass {
@Value("${my.property.name}")
private String[] myValues;
}
编辑:使用mutliple逗号分隔值更新代码以解析属性:
my.property.name=aaa,bbb,ccc
如果这不起作用,您可以使用属性定义一个bean,手动注入并处理它:
<bean id="myProperties"
class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations">
<list>
<value>classpath*:my.properties</value>
</list>
</property>
</bean>
和bean:
@Component
class MyClass {
@Resource(name="myProperties")
private Properties myProperties;
@PostConstruct
public void init() {
// do whatever you need with properties
}
}
答案 1 :(得分:39)
在配置类
中@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;
}
}
答案 2 :(得分:34)
有各种方法可以达到同样的目的。以下是春季常用的一些方法 -
使用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
,我找到了一个很好的link来了解版本兼容性 -
@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");
}
}
答案 3 :(得分:25)
这是一个额外的答案,对我理解其工作原理也很有帮助:http://www.javacodegeeks.com/2013/07/spring-bean-and-propertyplaceholderconfigurer.html
必须使用 static ,修饰符
声明任何BeanFactoryPostProcessor bean
@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();
}
}
答案 4 :(得分:7)
如果您需要在不使用@Value的情况下手动阅读属性文件。
感谢Lokesh Gupta精心撰写的页面:Blog
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;
}
}
答案 5 :(得分:6)
您需要在应用程序上下文中放置PropertyPlaceholderConfigurer bean并设置其位置属性。
请在此处查看详细信息:http://www.zparacha.com/how-to-read-properties-file-in-spring/
您可能需要稍微修改属性文件才能使此工作正常工作。
希望它有所帮助。
答案 6 :(得分:1)
另一种方法是使用ResourceBundle。基本上,您使用不带'.properties'的名称获取捆绑包。
private static final ResourceBundle resource = ResourceBundle.getBundle("config");
您可以使用以下方法恢复任何值:
private final String prop = resource.getString("propName");
答案 7 :(得分: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>
答案 8 :(得分:0)
我建议您阅读SpringBoot文档中有关注入外部配置的链接https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html。他们并不只是谈论从属性文件中检索,而是谈论YAML甚至是JSON文件。我发现它很有帮助。我希望你也这样做。
答案 9 :(得分:0)
我想要一个不受spring管理的实用程序类,因此没有@Component
,@Configuration
等spring注释。但是我希望该类从application.properties
读取
我设法通过使类了解Spring Context,从而了解了Environment
,从而使environment.getProperty()
正常工作来使它工作。
明确地说,我有:
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 (请参见Spring get current 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);
}
}