2015-11-04 43 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