在非Spring类中获取SpringBoot属性

时间:2018-09-25 17:22:52

标签: java spring-boot

我在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");
    }

    ...
}

1 个答案:

答案 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"));
}