我的内容保存在.properties文件中。我正在使用@PropertySource加载属性文件。
如何使用@PropertySource批注从属性文件中获取内容以进行映射?
我的媒体资源文件如下:
a= abc
b= bcd
c= cde
在我的组件中,我想读取属性文件并将其内容放置在地图中。
@PropertySource("classpath:myData.properties")
public class myComponentService {
@Autowired
private Environment environment;
Map<String, String> myMap = new HashMap<String, String>(); //Property file content goes here
}
我尝试了类似的方法,但这不起作用。
Map<String, String> myMap= new HashMap<String, String>();
Properties myProperties = new Properties();
myProperties .putAll(myMap);
答案 0 :(得分:1)
有一种更好的( cleaner )方法,可以通过如下创建一个Configuration Property bean来实现:
@Data
@Component
@ConfigurationProperties(prefix = "custom")
public class CustomPropertiesConfig {
private Map<String, String> connection= new HashMap<>();
}
然后像这样在application.yml(Yaml属性文件)中定义地图:
custom:
connection:
key1: value1
key2: value2
最后但并非最不重要的:
@Log4j2
@EnableConfigurationProperties
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class);
}
@Bean
CommandLineRunner run(CustomPropertiesConfig config){
return (args)->{
Map<String, String> connection = config.getConnection();
if(connection.containsKey("key1")){
log.info("holla");
}
};
}
}
请注意:
Spring框架提供了两个方便的类,可用于 加载YAML文档。 YamlPropertiesFactoryBean将YAML加载为 属性和YamlMapFactoryBean将YAML加载为地图。
那:
无法使用@PropertySource批注来加载YAML文件。 因此,如果您需要以这种方式加载值,则需要使用 属性文件。
因此,当您尝试从Yaml属性文件绑定到地图时,此答案是有效的
答案 1 :(得分:0)
嗯,不确定,你想做什么...
@PropertySource通常是这样使用的:
@Configuration
@PropertySource("classpath:config.properties")
public class DbConfig {
@Value("${db.url}")
private String dbUrl;
@Value("${db.user}")
private String dbUser;
...
在“ config.properties”中指定了“ db.url”和“ db.user”。
也许您也应该研究Spring的Environment类:
@Autowired
private Environment environment;
答案 2 :(得分:0)
这是Spring XML配置
<context:property-placeholder location="classpath*:database.properties,classpath*:query.properties"/>
您可以在应用程序中使用以下注释。
@Value("${propertiesName}")
答案 3 :(得分:0)
所以,我尝试了以下两种方法,它们都起作用:
方法1:我的属性文件的内容如下-
search.myprop.a = abc
search.myprop.b = bcd
search.myprop.c = def
在我的Java组件中:
import org.springframework.core.env.AbstractEnvironment;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.EnumerablePropertySource;
import org.springframework.core.env.Environment;
import org.springframework.core.env.MapPropertySource;
import org.springframework.core.env.PropertySource;
import org.springframework.beans.factory.annotation.Autowired;
....
@org.springframework.context.annotation.PropertySource("classpath:myproperty-file-.properties")
public class MyBaseClass {
@Autowired
private Environment environment;
...
Map<String, String> myMap= new HashMap<String, String>();
for (PropertySource<?> propertySource : ((ConfigurableEnvironment) environment).getPropertySources()) {
if (propertySource instanceof EnumerablePropertySource) {
for (String key : ((EnumerablePropertySource) propertySource).getPropertyNames()) {
if (key.startsWith("search")) {
myMap.put(key.replace("search.myprop.", ""), propertySource.getProperty(key).toString());
}
}
}
}
这完全符合我的要求。但是不利的是遍历所有属性文件。更好的方法是使用@ConfigurationProperties批注。 参考:[https://www.baeldung.com/configuration-properties-in-spring-boot][1]
方法2:
创建一个配置文件。
import java.util.Map;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
@Configuration
@PropertySource("classpath:myproperty-file.properties")
@ConfigurationProperties(prefix = "search")
public class MypropConfigProperties {
private Map<String, String> myprop;
public Map<String, String> getMyProp() {
return myprop;
}
public void setMyProp(Map<String, String> myprop) {
this.myprop= myprop;
}
}
在您的Java类中
public class MyBaseClass {
private MypropConfigProperties mypropConfigProperties;
@Autowired
public void setMyProp(MypropConfigProperties mypropConfigProperties) {
this.mypropConfigProperties= mypropConfigProperties;
}
.....
log.info(this.mypropConfigProperties.getMyProp().toString()); // this does the final magic
....