spring-boot - 在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 注释。
解决方案
@DependsOn
似乎是您问题的答案。
如果添加@DependsOn
到 restTemplate,那么 Spring 将保证DeveloppementPropertySetter
bean 在尝试创建 restTemplate 之前完全初始化。
“我不想使用@DependsOn”绝不是一个有效的声明。
在创建 RestTemplate 之前,必须完全初始化 DeveloppementPropertySetter bean,但不会将 DeveloppementPropertySetter 注入到 RestTemplate bean。这种情况似乎正是@DependsOn
创建注释的原因。
推荐阅读
- reactjs - React + MaterializeCSS + 动态渲染下拉菜单(故障位置)
- ios - 设置后关闭 ShortcutViewController
- firebase - 在firebase中禁用长度密码
- java - Spring:注入任何替代方案
- python - Neo4j 驱动程序在执行查询时关闭连接
- vim - 维姆。如何强制在新标签页中打开文件?
- android - 无法解决 R aapt.exe 以非零退出值 1 和许多其他此类错误完成
- spring - 带有来自本机查询的参数的 Spring 实体动态计算字段
- java - 在 mysql 工作台和 java 应用程序中获取不同的日期值
- ruby - 如何使用 Rspec 测试带有块的 ruby 模块方法?