我了解如何配置spring-boot,它提供了成熟而明智的覆盖机制,该文献已被很好地证明,但是我正在转换一个应用程序,该应用程序从与spring-boot机制不符的其他来源获取其配置。
最终,该应用程序使属性可用于可以使用@Value(“ $ the.prop.key:default”)绑定或在spring xml配置中使用的代码。这些属性的检索和绑定方式无法更改。
我正在尝试配置嵌入式tomcat服务器端口,但是我能做到这一点的唯一方法是使用application.properties。我可以将其更改为其他文件,甚至可以更改位置,但不能更改机制(它必须是文件)。
查看spring-boot代码,我看到它使用EmbeddedServletContainerCustomizer实现的概念来设置这些属性。很好,我将创建一个实现并使用此实现设置服务器属性。但是不幸的是,您有2个实现试图做同样的事情ServerProperties和我的实现。代码对这些命令进行了排序,但是由于ServerProperties尚未对其进行排序,因此将其设置为最低优先级,并且低优先级将在最后执行,因此我的实现将被覆盖。
相反,我实现了一个BeanPostProcessor:
@Named
public class SpringBootCustomConfigurator implements BeanPostProcessor {
@Value("$the.prop.key:8080")
private int port;
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
if (bean instanceof ServerProperties) {
ServerProperties serverProperties = (ServerProperties) bean;
serverProperties.setPort(port);
}
return bean;
}
}
这确实是我需要做的,但并不是令人满意的实现。有什么想法吗?
由于它是关于外部性的新来源,我认为这将是更自然的书写ApplicationContextInitializer
(或ApplicationListener
监听在启动春季启动的事件之一),增加了一个新的PropertySource
你Environment
在正确的地方。您可以使用SpringApplication
或使用来注册启动器META-INF/spring.factories
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句