我正在使用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的自动配置源代码示例,我没有看到他们这样做,所以感觉就像是代码味道。
答案 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件事:
server.port
不为空,请使用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。