Конфигурация 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");
            }
    });    
}