Архей Основы
Netflix Archaius — это библиотека для управления настройкой приложения. Рассмотрим файл свойств «sample.properties», содержащий свойство с именем «myprop»:
1
|
myprop=myprop_value_default |
Вот как файл загружается с помощью Archaius:
1
2
3
4
5
6
|
ConfigurationManager .loadCascadedPropertiesFromResources( "sample" ); String myProp = DynamicPropertyFactory.getInstance().getStringProperty( "myprop" , "NOT FOUND" ).get(); assertThat(myProp, equalTo( "myprop_value_default" )); |
Archaius может загрузить свойство, соответствующее среде, учитывая, что существует «sample-perf.properties» с той же конфигурацией, переопределенной для среды perf:
1
|
myprop=myprop_value_perf |
Теперь Archaius можно поручить загружать конфигурацию каскадным способом, добавив в файл sample.properties следующее:
1
2
3
|
myprop=myprop_value_default @next =sample-${ @environment }.properties |
И тест будет выглядеть так:
1
2
3
4
5
6
7
|
ConfigurationManager.getDeploymentContext().setDeploymentEnvironment( "perf" ); ConfigurationManager .loadCascadedPropertiesFromResources( "sample" ); String myProp = DynamicPropertyFactory.getInstance().getStringProperty( "myprop" , "NOT FOUND" ).get(); assertThat(myProp, equalTo( "myprop_value_perf" )); |
Основы Spring Property
Основы свойств Spring очень хорошо объяснены на ссылочном сайте Spring Framework здесь . Короче говоря, если есть файл свойств «sample.properties», его можно загрузить и ссылаться следующим образом:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
@Configuration @PropertySource ( "classpath:/sample.properties" ) public class AppConfig { @Autowired Environment env; @Bean public TestBean testBean() { TestBean testBean = new TestBean(); testBean.setName(env.getProperty( "myprop" )); return testBean; } } |
Или даже проще, они могут быть разыменованы с заполнителями следующим образом:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
@Configuration @PropertySource ( "classpath:/sample.properties" ) public class AppConfig { @Value ( "${myprop}" ) private String myProp; @Bean public TestBean testBean() { TestBean testBean = new TestBean(); testBean.setName(myProp)); return testBean; } @Bean public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { return new PropertySourcesPlaceholderConfigurer(); } } |
Создание свойств Archaius видимым для Spring
Итак, теперь вопрос в том, как сделать свойства Archaius видимыми в Spring. Я выбрал несколько быстрый и грязный подход, но его можно исправить, чтобы удовлетворить ваши потребности. Мой подход заключается в определении Spring PropertySource, который внутренне делегирует Archaius:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
import com.netflix.config.ConfigurationManager; import com.netflix.config.DynamicPropertyFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.env.PropertySource; import java.io.IOException; public class SpringArchaiusPropertySource extends PropertySource<Void> { private static final Logger LOGGER = LoggerFactory.getLogger(SpringArchaiusPropertySource. class ); public SpringArchaiusPropertySource(String name) { super (name); try { ConfigurationManager .loadCascadedPropertiesFromResources(name); } catch (IOException e) { LOGGER.warn( "Cannot find the properties specified : {}" , name); } } @Override public Object getProperty(String name) { return DynamicPropertyFactory.getInstance().getStringProperty(name, null ).get(); } } |
Сложная часть заключается в регистрации этого нового PropertySource в Spring, это можно сделать с помощью ApplicationContextInitializer, который запускается до инициализации контекста приложения:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
import com.netflix.config.ConfigurationBasedDeploymentContext; import org.springframework.context.ApplicationContextInitializer; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.util.StringUtils; public class SpringProfileSettingApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> { @Override public void initialize(ConfigurableApplicationContext ctx) { ctx.getEnvironment() .getPropertySources() .addFirst( new SpringArchaiusPropertySource( "samples" )); } } |
И, наконец, регистрация этого нового ApplicationContextInitializer в Spring описана здесь . По сути, это все, теперь свойства Netflix Archaius должны работать в приложении Spring.
Ссылка: | Свойства Netflix Archaius в проекте Spring от нашего партнера JCG Биджу Кунджуммена в блоге all and sundry. |