我想添加一个自定义PropertySource(该类,而不是注释)。注释不足,因为它仅处理文件源。
有效的方法是定义自己的ApplicationContextInitializer并将适当的声明添加到META-INF / spring.factories。 ApplicationContextInitializer仅使用:Environment.getPropertySources().addLast(...)
但是有一些缺点,主要是:
它总是运行,但是最好的行为是仅在满足某些条件时运行(@ConditionalOnClass等)
如何实现呢?理想情况下,我将使用@Condition ...批注编写自动配置,并在内部声明此类初始化程序(最好是有序的)。
编辑:
在我的特定情况下,我想定义Archaius PolledConfigurationSource,但是仅当Archaius在类路径上时-这就是为什么我想在生命周期的早期就将@ConditionalOnClass与事件监听器一起使用的原因。
最佳答案
您可能有一个中间类-您的应用程序的一部分,我们称之为“ ProviderConfigurer”-其目标是加载服务(与META-INF / services / targetSPi打包在单独的jar中),而该服务又将加载Archaius 。
因此,要激活Archaius,您将不得不放置2个罐子而不是一个,但是ProviderConfigurer将能够加载Service提供的属性源(API将是您必须定义的接口的一部分...),如果在类路径中会发现任何类,如果服务未找到实现您要为此目的定义的SPI的任何类,则不执行任何操作。