Guice и общая конфигурация приложения - PullRequest
20 голосов
/ 26 января 2011

Для программного обеспечения для мониторинга, написанного на Java, я рассматриваю возможность использования Google Guice в качестве поставщика DI. Проект должен загрузить свою конфигурацию из внешнего ресурса (файла или базы данных). Приложение предназначено для работы в автономном режиме или в контейнере сервлетов.

На данный момент конфигурация не содержит привязок или параметров для внедрения зависимостей, только некоторые глобальные параметры приложения (определения соединений JDBC и связанные объекты управления / мониторинга баз данных).

Я вижу два варианта:

  • для использования другой библиотеки, например Конфигурация Apache Commons , которая поддерживает источники конфигурации файлов и JDBC (и многие другие)

или

  • использовать файловый аддон для Guice, например guice-xml-config для хранения опций приложения (это позволит настроить часть DI позже, если это станет необходимым).

Вы бы порекомендовали использовать Guice для обеих задач или оставить общую конфигурацию приложения отдельно от внедрения зависимостей? Какие преимущества и недостатки вы считаете наиболее важными?

Ответы [ 4 ]

33 голосов
/ 26 января 2011

Прямо из файла 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").

4 голосов
/ 23 декабря 2015

Попробуйте Настройка конфигурации доступна в maven central, она поддерживает свойства, формат 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);
    }
}
3 голосов
/ 24 января 2014

Проверьте библиотеку регулятора:

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

1 голос
/ 20 июня 2013

Я столкнулся с той же проблемой в моем собственном проекте. Мы уже выбрали Guice в качестве DI-фреймворка, и, для простоты, хотели использовать его также с настройкой.

Мы закончили чтение конфигурации из файла свойств с помощью Конфигурация Apache Commons и привязали их к инжектору Guice, как предложено в FAQ по Guice Как ввести параметры конфигурации? .

@Override public void configure() {
    bindConstant().annotatedWith(ConfigurationAnnotation.class)
        .to(configuration.getString("configurationValue"));    
}

Перезагрузка конфигурации, поддерживаемой Commons Configuration, также довольно легко внедряется в внедрение Guice.

@Override public void configure() {
    bind(String.class).annotatedWith(ConfigurationAnnotation.class)
        .toProvider(new Provider<String>() {
            public String get() {
                return configuration.getString("configurationValue");
            }
    });    
}
...