2011-01-26 2 views
18

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

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

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

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

или

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

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

ответ

29

Это просто чавкать файл свойств в модуле 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").

+1

+1 Я думаю, вы должны также упомянуть как свойства вводятся с помощью '@ Named'. – ColinD

1

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

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

@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"); 
      } 
    });  
} 
3

Проверьте библиотека Governator:

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

Try Guice configuration доступны на 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); 
    } 
} 
Смежные вопросы