首页 > 解决方案 > 在spring-boot中bean初始化之前设置系统属性

问题描述

我在 bean 的 @PostConstruct 装饰方法中添加了一些系统属性,如下所示:

@Profile("dev")
@Component
public class DeveloppementPropertySetter {

    @PostConstruct
    public void setProperty() {
        System.setProperty("ip", "X.X.X.X");
        System.setProperty("port", "1234");
    }
}

当我尝试从另一个 bean(在另一个类中)获取这些属性时:

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
  String ip = System.getProperty("ip");
  String port = System.getProperty("port");
  (... using port and ip to customize the builder ...)
}

我得到NullPointerException并且 spring 无法实例化 restTemplate bean。如何确保 bean DeveloppementPropertySetter在restTemplate之前被初始化?我不想使用 @DependsOn 注释。

标签: spring-bootsystem-properties

解决方案


@DependsOn似乎是您问题的答案。

如果添加@DependsOn到 restTemplate,那么 Spring 将保证DeveloppementPropertySetterbean 在尝试创建 restTemplate 之前完全初始化。

“我不想使用@DependsOn”绝不是一个有效的声明。

在创建 RestTemplate 之前,必须完全初始化 DeveloppementPropertySetter bean,但不会将 DeveloppementPropertySetter 注入到 RestTemplate bean。这种情况似乎正是@DependsOn创建注释的原因。


推荐阅读