java - Spring Boot - 基于其他属性自动配置属性?

标签 java spring-boot

我正在使用 Web Spring Boot 1.4.3 并创建自定义 @AutoConfigure 来设置一堆属性。事实证明,我设置的许多属性都依赖于一个内置的 Spring 属性:server.port。问题:让我的自动配置器使用此属性(如果存在)的最佳方法是什么,否则默认为 9999?

以下是我使用属性文件执行此操作的方法:

    myapp.port = ${server.port:9999}

以下是我使用自动配置的进展情况:

@Configuration(prefix="myapp")
@EnableConfigurationProperties(MyAppProperties.class)
public class MyAppProperties {
    @Autowired
    ServerProperties serverProperties;

    Integer port = serverProperties.getPort() otherwise 9999?

}

我考虑过使用@PostConstruct来执行逻辑,但是查看Spring-Boot的自动配置源代码示例,我没有看到他们这样做,所以感觉像是代码味道。

最佳答案

终于明白了!关键是使用 @Bean 而不是 @EnableConfigurationProperties(MyProps.class) 公开我的依赖属性。由于 Spring 注入(inject)属性的顺序,使用 @Bean 让我默认使用依赖的 server.port 属性,同时仍然让 application.properties 文件覆盖它。完整示例:

@ConfigurationProperties(prefix="myapp")
public class MyProps {
    Integer port = 9999;
}

@AutoConfigureAfter(ServerPropertiesAutoConfiguration.class)
public class MyPropsAutoConfigurer {
    @Autowired
    private ServerProperties serverProperties;

    @Bean
    public MyProps myProps() {
        MyProps myProps = new MyProps();
        if (serverProperties.getPort() != null) {
            myProps.setPort(serverProperties.getPort());
        }
        return myProps;
    }
}

这可以实现三件事:

  1. 默认为 9999
  2. 如果server.port不为空,则使用它
  3. 如果用户在 application.properties 文件中指定 myapp.port,请使用它(Spring 在加载 @Bean 后注入(inject)它)

关于java - Spring Boot - 基于其他属性自动配置属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41538171/

相关文章:

java - 在 java 中创建 Neo4j 关系时出错

java - war 中缺少依存关系。 Gradle构建项目

java - 如何覆盖禁用的 JPanel 的背景颜色

java - SpringBoot @KafkaListener 得到 MessageConversionException : Cannot convert from A to B

java - Spring Boot 自定义 Bean 加载器

java - 如何插入 780k 记录 Spring Data Postgres

java - 使用java连接到互联网

java - Web 服务客户端 - 带有 keystore

javascript - JQuery 点击事件在 Thymeleaf 上不起作用

java - 在以下任何来源中均未找到插件 [id : 'org.springframework.boot' , 版本: '2.1.7.RELEASE']