Подтвердить что ты не робот

Почему нет никакого файла конфигурации для инъекции зависимостей с Google Guice?

Я проверяю Google Guice как инфраструктура DI, но я немного озадачен: почему нет файла конфигурации вообще?

Я нашел частичное объяснение этого вопроса, но до сих пор неясно, как я смогу установить свои роли компонента (или любую другую вещь, которую мне нужно использовать переключатель) без файла конфигурации.

Любая помощь оценивается!

4b9b3361

Ответ 1

Конфигурация находится в коде вместо файлов конфигурации, что является допустимым решением для многих сценариев.

Да, это означает, что вам нужно перестроить (возможно, только модули), если вы хотите опубликовать другой способ сантехнического приложения - хотя, конечно, вы все равно можете получить некоторые значения конфигурации из аргументов командной строки, файлов свойств и т.д. если вы хотите.

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

Различные каркасы DI имеют разные преимущества и компромиссы - используйте то, что наиболее подходит для вашего приложения.

Ответ 2

Тривиально вводить конвертацию с использованием файлов конфигурации, если вы так склонны. Мы используем Guice вместе с простым API, который загружает файлы свойств, где все происходит, которые действительно нужно параметризовать. Это можно использовать вместе с аннотациями @Named и т.д., И, конечно, вы можете иметь некоторые условные обозначения в модулях (хотя это хорошая идея не переделывать это).

Это пример того, как настраивается часть нашей начальной загрузки:

public class MetModules extends AbstractModule {

    private static final Logger log = LoggerFactory.getLogger(MetModules.class);

    private final Settings settings;

    public MetModules(Settings settings) {
        this.settings = settings;
    }

    @Override
    protected void configure() {

        // common (stage independent modules) go here
        install(new CommandsModule());
        install(new ServletsModule());
        install(new DataBaseModule(settings));
        install(new JobsModule(settings));

        // any development/ production specific modules
        Stage stage = currentStage();
        if (Stage.DEVELOPMENT.equals(stage)) {
            configureForDevelopment();
        } else { // PRODUCTION
            configureForProduction();
        }
    }

    /**
     * Install modules that will be used in development.
     */
    private void configureForDevelopment() {

        // Mock implementation of email delivery that just logs it got a
        // message rather than trying to send it.
        install(new AbstractModule() {
            @Override
            protected void configure() {
                bind(Delivery.class).toInstance(new Delivery() {

                    public String deliver(MailMessageExchange exchange)
                            throws DeliveryException {
                        log.info("email message: "
                                + exchange.getMessage().getMailMessage()
                                + " to "
                                + Arrays.asList(exchange.getMessage()
                                        .getMailMessage().getTo())
                                + " (not sent)");
                        return "fooMessageId";
                    }
                });
            }
        });

        // local in-memory registry suffices
        install(new LocalServiceRegistryModule());

        // local in memory db implementations of services
        install(new LocalServicesModule());
    }

    /**
     * Install modules that will be used in production.
     */
    private void configureForProduction() {
        // we really only need this (error interception and audit logging)
        // in production
        install(new AopModule());
        install(new ZooKeeperServiceRegistryModule());      }
}

Где Настройки - это то, что читает наши файлы свойств и т.д. Прямо сейчас разработка/производство вместе со специфическими настройками переопределяет специфику развертываний, похоже, делает эту работу для нас, но мы могли бы пойти дальше с этим, если бы захотели явно.

Ответ 3

Большая часть конфигурации DI будет одинаковой от одного развертывания к другому, поэтому они могут быть хорошо настроены с использованием кода, что делает настройку Guice очень кратким, и вы получаете преимущества проверки типа времени компиляции, инструментов рефакторинга, навигации по коду и др.

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

Ответ 4

Множество настроек в Guice неявно, через @Inject Annotation. Большая сложность проектов связана с большим количеством проектов Artifacts. Файлы Java, файлы Xml, файлы свойств, базы данных, параметры. Guice пытается удалить часть этой сложности, не используя файлы конфигурации.

Повторное подключение приложения легко во время компиляции. Скорее всего, вам нужно будет только отредактировать класс модуля. Для большинства классов, созданных Guice, вам не потребуется никакой конфигурации, но только @Inject в правильных местах - вам нужно будет всего лишь настроить что-либо, когда у вас есть две разные реализации одного и того же интерфейса - или когда вы хотите вводить классы из внешние библиотеки, использующие классы Provider.

Ответ 5

Не уверен, что вы подразумеваете под файлом, но Guice позволяет вам изменять реализации через Binder и пользовательский Поставщики.

Ответ 6

Недавно я создал следующий проект.

http://code.google.com/p/guice-property-injector/

Это WIP, но позволяет запускать свойства свойств из файла свойств на основе среды.