如何将@Propertysource文件转换为Map?

时间:2019-03-13 09:55:43

标签: java spring spring-boot

我的内容保存在.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);

4 个答案:

答案 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:

  1. 创建一个配置文件。

    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;
        }
    }
    
  2. 在您的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
    ....