Spring Boot - 基于其他属性的AutoConfigure属性?

时间:2017-01-08 21:36:10

标签: java spring-boot

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

以下是我如何使用属性文件:

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

以下是我使用AutoConfiguration的程度:

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

    Integer port = serverProperties.getPort() otherwise 9999?

}

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

2 个答案:

答案 0 :(得分:1)

终于想通了!关键是使用@Bean而不是@EnableConfigurationProperties(MyProps.class)公开我的依赖属性。由于Spring注入属性的顺序,使用@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;
    }
}

这可以实现3件事:

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

答案 1 :(得分:0)

我个人更喜欢Spring 3.x之后的@Value注释(我相信)。

public class MyAppProperties {
    @Value("${server.port:9999}")
    private int port;
}

如果您在server.port中设置application.properties,则会使用其中设置的值。否则,它将默认为9999。