如何在Spring中读取外部属性文件?

时间:2019-03-09 03:03:42

标签: java spring

每个人都知道我们是否要读取属性文件,我们可以执行以下操作:

@Configuration
@PropertySource("classpath:/application.properties")
public class AppConfig {

    @Value("${app.name}")
    public String name;


    @Bean
    public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }

    @Bean
    public PostService postService() {
        return new PostServiceImpl(name);
    }

}

但是,现在我有一个类似于SpringBoot的框架。它可以将Spring与Mybatis集成。

问题是前面的代码只能读取我的项目类路径文件,但是我需要使用我的框架读取属性文件项目。我该怎么做?

更新

对不起大家。也许我说不清楚,所以下面是图片:picture

  • 我不使用SpringBoot

  • 我想读取项目(使用我的框架)的类路径,而不是我的框架类路径。

谢谢。

5 个答案:

答案 0 :(得分:0)

Spring框架可以从不同位置读取外部配置文件。 它可以从您的项目目录中读取配置文件,但是您需要删除以下行:

@PropertySource("classpath:/application.properties")

将其限制为您的应用程序类路径。 您可以检查here以查看从中读取配置文件的不同位置。

答案 1 :(得分:0)

Spring提供了外部配置。这样,您可以在不同的环境中运行应用程序。

参考链接: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

如果您不喜欢application.properties作为配置文件名,则可以通过指定spring.config.name环境属性来切换到另一个文件名。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;

@Configuration
@PropertySource("classpath:db.properties")
@PropertySource("classpath:project.properties")
public class DBConfiguration {

@Autowired
Environment env;

  @Bean
  public DBConnection getDBConnection() {
    System.out.println("Getting DBConnection Bean for 
    App:"+env.getProperty("APP_NAME"));
    DBConnection dbConnection = new DBConnection(env.getProperty("DB_DRIVER_CLASS"), 
     env.getProperty("DB_URL"), env.getProperty("DB_USERNAME"), 
     env.getProperty("DB_PASSWORD").toCharArray());
    return dbConnection;
  }

 }

DB.properties:
#Database configuration
DB_DRIVER_CLASS=com.mysql.jdbc.Driver
DB_URL=jdbc:mysql://localhost:3306/Test
DB_USERNAME=root
DB_PASSWORD=root

project.properties:
APP_NAME=TEST APP

答案 2 :(得分:0)

如果您只是想自己从类路径中读取属性,则可以使用

Properties prop = new Properties();
InputStream input = this.getClass().getResourceAsStream("/application.properties")
prop.load(input);

// get the property value and print it out
System.out.println(prop.getProperty("foo"));

答案 3 :(得分:0)

对于要扫描应用程序类路径外部的属性的非引导用户:

@PropertySource(“ file:/path/to/application.properties”) 对于网络托管的远程属性,“文件”可以替换为“ http”

答案 4 :(得分:0)

我使用下一个选项从任何地方加载属性文件,并将其放入环境中以通过 Environment#getProperty@Value("name") 访问它:

@Configuration
public class MVCConfig {

    @Autowired
    private ConfigurableEnvironment env;

    @PostConstruct
    public void setup() {
       Properties config = new Properties();  
       try (InputStream stream = this.getClass().getResourceAsStream("/custom.properties")) {
           config.load(stream);
       }
       env.getPropertySources().addLast(new PropertiesPropertySource("mvc", config));
    }
}