2015-11-04 23 views
1

我想添加一个自定义PropertySource(类,而不是注释)。注释是不够的,因为它只处理文件源。自动配置春天引导添加PropertySource

工作的方法是定义自己的ApplicationContextInitializer并向META-INF/spring.factories添加适当的声明。 ApplicationContextInitializer只是使用: Environment.getPropertySources().addLast(...) 但也有一些缺点,主要表现在:

  • 它总是运行,但最好的行为是只如果某些条件得到满足运行(@ConditionalOnClass等)

如何实现这一目标?理想情况下,我会使用@Condition ... annotations编写自动配置,并在里面声明这样的初始化程序(最好是Ordered)。

编辑: 在我的特殊情况下,我想定义Archaius PolledConfigurationSource,但只有当Archaius是在类路径上 - 这就是为什么我想一起向监听器上的事件在生命周期很早就使用@ConditionalOnClass。

回答

1

您可以有一个中介类 - 您的应用程序的一部分,我们称之为“ProviderConfigurer” - 其目标是加载一个服务(打包在一个单独的包含META-INF/services/targetSPi的jar中)转会加载Archaius。 因此,要激活Archaius,您将不得不放置2个瓶子,而不是一个,但然后ProviderConfigurer将能够加载服务提供的属性源(API将成为您将必须定义的接口的一部分...)如果在类路径中发现任何内容,并且在服务没有找到实现SPI的任何类的情况下不做任何操作,则将为此目的进行定义。

+0

我不明白这有助于。如果我想通过包含/不包括jar来启用/禁用archaius配置,那么我可以创建一个只启用archaius集成的弹簧自动配置jar。事情就是这样做春天的方式 - 使其工作,如果任何依赖拉入archaius(如@ConditionalOnClass为豆)。 – mabn