我的Spring Boot Java项目应该选择哪种文件读取方式?

问题描述 投票:0回答:1

我正在开发一个 Spring Boot Java 项目。
我将首先解释我如何处理类似问题的情况,然后解释问题本身。

我正确处理的问题的类似情况

我需要获取一些取决于环境(测试/产品)的 API URL,因此我决定结合

@Configuration
@ConfigurationProperties
注释从 (application-test/application-prod).properties 文件中获取这些 URL和
${spring.profiles.active}
环境变量。我知道我可以在应用程序初始化中拥有 URL,因此,依靠 Spring 依赖管理是完成这项工作的最佳主意(简单地说,Spring Boot 在应用程序启动之前注入这些属性,这就是我想要的)。

问题

我需要读取一些可以存储在 .properties 文件中的新参数(不是“旧的”应用程序[-{env}].properties),但现在,不同之处在于我只能知道我拥有哪个属性文件在读取请求参数之后读取,而不是在应用程序启动之前读取。最重要的是,应该读取此 .properties 文件的类不是 Spring 托管类。一个MWE:

@Configuration
@ConfigurationProperties
@PropertySource("classpath:INAD/INAD-${spring.profiles.active}.properties")
public class MyInitializationConfig{
  private String var;
  // var getter/setter
}

@RestController
public class MyController{
  @Autowired
  MyService myService;

  @Autowired
  MyInitializationConfig myInitializationConfig;

  @PostMapping("/endpoint")
  public void endpoint(@RequestBody MyRequest myRequest){
    // here, I can get the initialized properties:
    myInitializationConfig.getProperties("configprop");

    myService.serviceMethod(myRequest);
  }
}

@Service
public class MyService{
  @Autowired
  MyInitializationConfig myInitializationConfig;

  public void serviceMethod(MyRequest myRequest){
    // here, I can get initialized properties, too:
    myInitializationConfig.getProperties("configprop");

    MyEntity myEntity = new MyEntity(myRequest);
    myEntity.entityMethod();
  }
}

// Has no Spring Boot annotations
public class MyEntity{
  private MyRequest myRequest;
  public MyEntity(MyRequest myRequest){
    this.myRequest = myRequest;
  }
  public void entityMethod(){
    // here, I would like to retrieve some .properties (not the initialized ones with MyInitializationConfig) values
  }
}

我的解决方案

请注意:

  1. (再次)问题是
    MyEntity
    (准确地说,
    MyEntity.entitymethod()
    ),而
    MyInitializationConfig
    不是问题的对象,因此,我只是想展示我如何处理与我所问的问题类似的问题.
  2. MyEntity
    不必是单例,这是我必须实例化更多次的东西。
  3. MyEntity
    构造函数应保留如我所写,即仅具有
    MyRequest
    对象参数,按逻辑,并用于测试目的。

所以:你是否同意我无法再使用 Spring Boot 注入读取这些属性值(例如,通过在 MyEntity 中使用 @Value 之类的东西),因为,正如目前所写的那样,

MyEntity
只是一个
new
Java 对象?如果没有,您认为我如何使用一些不需要在应用程序初始化时注入某些内容的 Spring Boot 注入?

最后我想了两个解决办法:

  1. 使用普通的 Java 文件读取 API,例如:
    new Properties().load(new FileInputStream("path/to/config.properties"))
  2. 使用 Spring Boot 文件读取 API,我读过这样的类
    org.springframework.core.io.DefaultResourceLoader
java spring-boot dependency-injection properties
1个回答
0
投票

我总是建议使用 Spring-boot beans 来管理我们的属性。

对于您的情况,

  1. 由于属性的使用是由 MyRequest 决定的,而不是特定于环境的,所以我们可以将所有这些放入 application.properties 文件中。
  2. 将属性注入到不同种类的bean中。例如:MyEntity1、MyEntity2。 (如果大多数字段相同,可能需要抽象)
  3. 对于MyService.serviceMethod(MyRequest myRequest),注入所有MyEntities,通过myRequest选择合适的。 (如果我们有太多实体,请考虑在这里使用策略模式)

伪代码:

应用程序.属性

request_1.key=k1
request_1.val=v1

request_2.key=k2
request_2.val=v2

实体

public class BaseEntity {
  public String key;
  public String val;
}
@Configuration
@ConfigurationProperties(prefix="request_1")
public class MyEntity1 extends BaseEntity{}

@Configuration
@ConfigurationProperties(prefix="request_2")
public class MyEntity2 extends BaseEntity{}

我的服务

public void serviceMethod(MyRequest myRequest){
  if (request 1) {
    // use MyEntity1 
  } else if (request 2) {
    // use MyEntity2
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.