我在application.properties
文件中定义了许多属性。这些文件通过@Configuration
,@PropertySource
和@ConfigurationProperties
批注被加载到整个系统的许多不同配置文件中。
此外,我还有一个与此系统分开的库,该库不依赖于Spring(理想情况下会保持这种状态)。在系统执行的某个时刻,它通过反射和无参数构造函数从该库中初始化类的实例。但是,在该初始化中,我想获取一个Spring属性并将其分配给本地字段-但是,正如我之前提到的,该库类不是Spring配置的,实际上是在一个完全不同的项目中。该怎么办?
我当前的解决方案是,当该属性在config类中初始化时,该属性的设置器还设置一个系统属性(通过System.setProperty("someProp", propValue)
),然后在该库类的no args构造函数中调用System.getProperty("someProp")
。但是,这确实很麻烦,尤其是我设置变量的那部分。也许可以通过某种方式将SpringBoot配置为自动将该特定属性传播为System属性?
我的代码atm
ServiceConfig.class
@Configuration
@PropertySource("classpath:application.properties")
@ConfigurationProperties(prefix = "service")
public class ServiceConfig {
private String serviceUrl;
public String getServiceUrl() {
return serviceUrl;
}
public void setServiceUrl(String serviceUrl) {
this.serviceUrl = serviceUrl;
System.setProperty("SERVICE_URL", serviceUrl);
}
}
我的application.properties
service.serviceUrl=http://localhost:8000
LibraryClass.class
public class LibraryClass {
private final String serviceUrl;
public LibraryClass() {
this.serviceUrl = getProperty("OAUTH_SERVICE_URL");
}
...
}
答案 0 :(得分:2)
如果您的LibraryClass
具有setter方法-在下面的示例中名为setServiceUrl(...)
-要设置此配置属性,可以将其添加到现有的ServiceConfig
配置类中:
@Bean
public LibraryClass getLibraryClass(@Value(${"OAUTH_SERVICE_URL"}) String serviceUrl) {
LibraryClass libraryClass = new LibraryClass();
libraryClass.setServiceUrl(serviceUrl);
return libraryClass;
}
除此之外-如果您不能修改LibraryClass
,因为它是第三方库的一部分,那么...您可以使用Spring的Environment
实例来读取所有所需的属性,稍后这些属性将可以在LibraryClass
的构造函数内部进行访问,并按照您作为系统属性的方式进行设置。还将其添加到您的配置类中:
@Autowired
public void setSystemPropsNeededForLibraryClassConstruction(Environment environment) {
System.setProperty("serviceUrl", environent.getProperty("serviceUrl"));
}