如何使用 Spring 从属性文件中读取

Posted

技术标签:

【中文标题】如何使用 Spring 从属性文件中读取【英文标题】:How to read from a properties files using Spring 【发布时间】:2020-06-17 11:39:39 【问题描述】:

我想使用 Spring 从一个属性文件中读取一个 URL、一个用户名和一个密码。我在网上阅读了很多示例,它们或多或少看起来都一样,但我就是不明白。

一个说example 显示了两个使用@value 注释的类似方法,另一个是使用Environment env,但使用后者的每个示例都说使用env.getProperty(),但是该对象似乎不存在该方法?使用@value 我不明白称为sampleService 的方法。我应该创建一个对象类吗?

     @Configuration
     @PropertySource("classpath:src/main/resources/config.properties")
     public class EnvironmentConfig 

    @Value("$config.properties")
     public static String url;

    @Value("$config.properties")
    public static String username;

    @Value("$config.properties")
    public static String password;

    @Bean
    public static DataSource logInSetup() 

        DriverManagerDataSource login = new DriverManagerDataSource();
        login.setUrl(url);
        login.setUsername(username);
        login.setPassword(password);

        return login;
     

     @Bean
     public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer() 

      return new PropertySourcesPlaceholderConfigurer();

我认为上面的内容甚至还不太接近。我确信这更简单,我正在努力做到这一点。

【问题讨论】:

【参考方案1】:

如果您的属性文件类似于:

url=...
username=...
password=...

你可以这样写:

@Configuration
@PropertySource("classpath:src/main/resources/config.properties")
public class EnvironmentConfig 

  @Bean
  public DataSource logInSetup(@Value("$url") String url, @Value("$username") String username, @Value("$password") String password) 

        DriverManagerDataSource login = new DriverManagerDataSource();
        login.setUrl(url);
        login.setUsername(username);
        login.setPassword(password);
        return login;
   

你应该在所有地方删除static。避免在 Spring 中使用静态。

而且你不需要 PropertySourcesPlaceholderConfigurer 作为 bean。这就是 PropertySource 注释应该做的。无论如何,避免在 Spring 中使用 new。特别是对于春季课程。如果你这样做,很可能是一个错误。

顺便说一句,config.properties 的 url 很可能不正确,应该只是 @PropertySource("classpath:config.properties")@PropertySource("classpath:/config.properties")

【讨论】:

即便如此,我仍然不清楚如何从返回的对象中提取值。当我调用它时,它应该是什么样子?我需要创建 get 方法吗? 我想我写的正是你如何提取值:你可以将带有属性名称的值注释添加到使用 Bean 注释的方法的参数中。另一种方法与您所做的类似:将值添加到配置类成员。确保它们不是静态的。 我的意思是如何从对象登录中提取它们,因为没有 get 方法? 您是问设置后如何从 DriverManagerDataSource 中提取它们吗?不知道,什么是 DriverManagerDataSource?如果你需要在别处访问这些数据,为什么不设置在别处呢?无论如何,这不是春天的问题。 Spring 允许您提取属性。以后做什么取决于你自己。 是的,这就是我要问的。从属性文件中读取数据后,我无法在网上找到任何显示如何实际使用数据的内容

以上是关于如何使用 Spring 从属性文件中读取的主要内容,如果未能解决你的问题,请参考以下文章

@ServiceActivator 如何在 Spring Boot 中从属性文件中读取 inputChannel?

Spring Boot如何读取jar外的属性文件

spring boot 入门1-----如何使用@Value注解读取配置文件以及使用@ConfigrationProperties注解

Spring:如何将属性文件提供给 Java.exe

如何在 Spring Boot 中从应用程序属性文件中读取 jpa 命名查询?

如何让是spring启动时加载一个类。这里类实现了读取xml配置数据到内存中(不是属性文件)