我正在开发一个 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
}
}
请注意:
MyEntity
(准确地说,MyEntity.entitymethod()
),而MyInitializationConfig
不是问题的对象,因此,我只是想展示我如何处理与我所问的问题类似的问题.MyEntity
不必是单例,这是我必须实例化更多次的东西。MyEntity
构造函数应保留如我所写,即仅具有 MyRequest
对象参数,按逻辑,并用于测试目的。所以:你是否同意我无法再使用 Spring Boot 注入读取这些属性值(例如,通过在 MyEntity 中使用 @Value 之类的东西),因为,正如目前所写的那样,
MyEntity
只是一个 new
Java 对象?如果没有,您认为我如何使用一些不需要在应用程序初始化时注入某些内容的 Spring Boot 注入?
最后我想了两个解决办法:
new Properties().load(new FileInputStream("path/to/config.properties"))
org.springframework.core.io.DefaultResourceLoader
我总是建议使用 Spring-boot beans 来管理我们的属性。
对于您的情况,
伪代码:
应用程序.属性
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
}
}