Конфигурация Guice и общего приложения
Для программного обеспечения для мониторинга, написанного на Java, я рассматриваю использование Google Guice как поставщика DI. Проект должен загрузить свою конфигурацию из внешнего ресурса (файла или базы данных). Приложение предназначено для работы в автономном режиме или в контейнере сервлетов.
В настоящий момент конфигурация не содержит привязок или параметров для инъекции зависимостей, только некоторые глобальные параметры приложения (определения соединения JDBC и связанные с ними объекты управления/мониторинга базы данных).
Я вижу два варианта:
- использовать другую библиотеку, например Apache Commons Configuration, которая поддерживает источники конфигурации файлов и JDBC (и многие другие)
или
- использовать файловый аддон для Guice, например guice-xml-config, чтобы сохранить параметры приложения (это позволит позже настроить часть DI, если это становится необходимым).
Вы бы рекомендовали использовать Guice для обеих задач или сохранить общую конфигурацию приложения отдельно от инъекции зависимостей? Какие преимущества и недостатки вы считаете наиболее важными?
Ответы
Ответ 1
Прямо разбить файл свойств в модуле Guice:
public class MyModule extends AbstractModule {
@Override
protected void configure() {
try {
Properties properties = new Properties();
properties.load(new FileReader("my.properties"));
Names.bindProperties(binder(), properties);
} catch (IOException ex) {
//...
}
}
}
Позже легко перейти из свойств в другие источники конфигурации.
[изменить]
Кстати, вы можете получить введенные свойства, аннотируя его с помощью @Named("myKey")
.
Ответ 2
Проверьте библиотеку регулятора:
https://github.com/Netflix/governator/wiki/Configuration-Mapping
Вы получите аннотацию @Configuration и несколько поставщиков конфигурации. В коде это помогает увидеть, где используются параметры конфигурации:
@Configuration("configs.qty.things")
private int numberOfThings = 10;
Кроме того, при запуске вы получите хороший отчет о конфигурации:
https://github.com/Netflix/governator/wiki/Configuration-Mapping#configuration-documentation
Ответ 3
Попробуйте Конфигурация Guice, доступную на центральном сервере maven, она поддерживает свойства, формат HOCON и JSON.
Вы можете добавлять свойства из файла application.conf к своей службе как:
@BindConfig(value = "application")
public class Service {
@InjectConfig
private int port;
@InjectConfig
private String url;
@InjectConfig
private Optional<Integer> timeout;
@InjectConfig("services")
private ServiceConfiguration services;
}
Вы должны установить модули ConfigurationModule как
public class GuiceModule extends AbstractModule {
@Override
protected void configure() {
install(ConfigurationModule.create());
requestInjection(Service.class);
}
}
Ответ 4
Я столкнулся с той же проблемой в своем собственном проекте. Мы уже выбрали Guice в качестве DI-framework и чтобы все было просто хотеть использовать его также с настройкой.
Мы закончили чтение конфигурации из файла свойств с помощью Apache Commons Configuration и связывания их с инжектором Guice, как это предлагается в Guice FAQ Как добавить параметры конфигурации?.
@Override public void configure() {
bindConstant().annotatedWith(ConfigurationAnnotation.class)
.to(configuration.getString("configurationValue"));
}
Перезагрузка конфигурации, поддерживаемая конфигурацией Commons, также довольно легко реализуется в инъекции Guice.
@Override public void configure() {
bind(String.class).annotatedWith(ConfigurationAnnotation.class)
.toProvider(new Provider<String>() {
public String get() {
return configuration.getString("configurationValue");
}
});
}