Статьи

Свойства Netflix Archaius в проекте Spring

Архей Основы

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.