spring boot : 如何动态设置 spring 属性

Onk*_*nki 3 java spring properties spring-boot

有很多属性可以在 spring boot 应用程序的 application.properties 中定义。

但我想传递属性来配置 ssl 以从代码内部弹出。

server.ssl.enabled=true
# The format used for the keystore 
server.ssl.key-store-type=PKCS12
# The path to the keystore containing the certificate
server.ssl.key-store=keys/keystore.jks
# The password used to generate the certificate
server.ssl.key-store-password=changeit
# The alias mapped to the certificate
server.ssl.key-alias=tomcat
Run Code Online (Sandbox Code Playgroud)

因此,这些将是从 application.properties 使用的 spring 定义的属性。我只想根据一些逻辑从代码中设置它们。

对于非 spring 应用程序,我仍然有一些想法,它们可以作为应用程序、会话或上下文属性传递,但我不知道这在 spring 中是如何工作的。

任何帮助,将不胜感激。

Tie*_*Nam 11

在 Spring Boot 中,您可以使用System.getProperty(String key)和 来读取和编辑属性System.setProperty(String key, String value)

public static void main(String[] args) {

    // set properties
    System.setProperty("server.ssl.enabled", "true");
    System.setProperty("server.ssl.key-store-type", "PKCS12");
    System.setProperty("server.ssl.key-store", "keys/keystore.jks");
    System.setProperty("server.ssl.key-store-password", "changeit");
    System.setProperty("server.ssl.key-alias", "tomcat");

    // run
    SpringApplication.run(DemoApplication.class, args);
}
Run Code Online (Sandbox Code Playgroud)

笔记

这将覆盖静态属性(不是全部,而是被覆盖的属性)。

  • 经过反复试验,我可以确保通过“System.setProperty”定义的值优先于“application.properties”文件中的值 (2认同)

小智 7

您需要像这样定义并注册一个 ApplicationListener:

public class DynamicPropertiesListener implements ApplicationListener<ApplicationEnvironmentPreparedEvent> {
  public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
    ConfigurableEnvironment environment = event.getEnvironment();
    // modify the properties here, see the ConfigurableEnvironment javadoc
  }
}
Run Code Online (Sandbox Code Playgroud)

现在注册监听器。如果您使用以下方法运行应用程序main

SpringApplication app = new SpringApplication(primarySources);
app.addListeners(new DynamicPropertiesListener());
app.run(args);
Run Code Online (Sandbox Code Playgroud)

或者,更好的是,创建src\main\resources\META-INF\spring.factories包含以下内容的文件:

org.springframework.context.ApplicationListener=x.y.DynamicPropertiesListener
Run Code Online (Sandbox Code Playgroud)

x.y你的监听器的包在哪里。


Aji*_*man 7

因为您知道在 Spring Boot 应用程序中启用 SSL 的属性。您可以像这样在 Spring Boot 应用程序中以编程方式传递这些属性:

@SpringBootApplication
public class SpringBootTestApplication {
    public static void main(String[] args) {

//      SpringApplication.run(SpringBootTestApplication.class, args);

        Properties props = new Properties();
        props.put("server.ssl.key-store", "/home/ajit-soman/Desktop/test/keystore.p12");
        props.put("server.ssl.key-store-password", "123456");
        props.put("server.ssl.key-store-type", "PKCS12");
        props.put("server.ssl.key-alias", "tomcat");

        new SpringApplicationBuilder(SpringBootTestApplication.class)
            .properties(props).run(args);
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我已经注释掉了这一点: SpringApplication.run(SpringBootTestApplication.class, args); 并使用SpringApplicationBuilder类向应用程序添加属性。

现在,这些属性在程序中定义,您可以根据您的要求应用条件和更改属性值。

  • 这仍然会考虑我在 application.properties 中定义的其他属性吗? (2认同)