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

Может ли кто-нибудь дать четкое объяснение, почему Google Guice полезен?

Я читал о Google Guice и понимаю общие проблемы с другими подходами к инъекции зависимостей, однако я еще не видел примера, когда кто-то использует Guice "на практике", где его значение становится ясным.

Мне интересно, знают ли кто-нибудь о таких примерах?

4b9b3361

Ответ 1

Использование Google Guice для обеспечения удобства тестирования модулей - это только преимущество на высоком уровне. Некоторые люди могут даже не использовать модульное тестирование в своем проекте. Люди используют Spring/Dependency Injection больше, чем для модульного тестирования.

Преимущество с низким уровнем использования Google Guice - это вопрос сплоченности вашего приложения, ваши классы в проекте могут быть слабо связаны между собой. Я могу предоставить класс для другого класса, не зависимо от него.

Рассмотрим следующий пример:

public class A{

}

public class B{
  A a = new A();
}

Класс B будет тесно связан с классом A, или, другими словами, он зависит от существования класса A.

Но с Guice я могу вместо этого сделать это слабо связанным следующим образом:

public class B{
    private A a;

    @Inject
    public B(A a){
        this.a = a;
    }
}

Класс B теперь слабо связан с A, и Guice отвечает за предоставление экземпляра A вместо B, чтобы его создать. С этим вы можете расширить его, чтобы обеспечить интерфейс от A до B, а реализация может быть объектом Mock, если вы хотите unit test ваши приложения.

Сказав, что мы только обсуждаем преимущества Injection Dependency до сих пор. Преимущества внедрения Google Guice:

  • Guice имеет очень чистую реализацию конструктора Injection. Как видно из примера, вы просто добавляете конструктор аннотации @Injection.
  • У Guice также есть Setter Injection с использованием той же аннотации.
  • Сказав это, аннотация, основанная на Injection, является очень чистым подходом по сравнению с внедрением на основе XML, как и в другой реализации DI.
  • Все инъекции и конфигурация зависимостей используют Java, поэтому вы гарантированно получите тип безопасности в своем приложении по умолчанию.
  • Guice имеет очень легкую реализацию Aspect Oriented Programming (или, возможно, вы можете назвать ее оболочкой для реализации AOPAlliance AOP). И хорошо, что он не генерирует заглушки или что-то еще.

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

Ответ 2

Возможно, вам стоит вернуться вовремя и присмотреться к тем проблемам, которые решил решить Guice. Чтобы понять мотивацию Guice, Боб Ли: Я не получаю Spring новости на TheServerSide.COM(и его комментарии) - это идеальная отправная точка. Затем, продолжите объявление Google Guice, Java Injection Framework (и комментарии) и Tech Talk: Боб Ли в Google Guice (и комментарии).

Лично я делился опасениями о злом XML: аддон XML-конфигурации, XML и возможные ошибки времени выполнения, подверженные ошибкам и отказоустойчивые строковые идентификаторы и т.д. и т.д. На самом деле я считаю, что скептические мнения о Spring и согласии были хороши для всех (включая Spring). Поэтому я был счастлив увидеть нового игрока в ландшафте каркаса DI, особенно в современной структуре, использующей функции Java 5 (дженерики и аннотации для безопасности типов).

И поскольку Google работает с Guice в критически важных приложениях (почти каждое приложение на основе Java также представляет собой приложение на основе Guice: AdWords, Google Docs, Gmail и даже YouTube, как сообщается в "Crazy" Боб Ли в Guice²), я не могу поверить, что Guice совершенно ошибается и не дает никакой ценности. К сожалению, я не думаю, что Google предоставит много кода этих приложений в качестве примеров... Но вы можете найти интересные вещи в списке приложений, которые используют Guice и/или список сторонних админов Guice. Или просмотрите книги, упомянутые в Guice². Или спросите Боба:)

Ответ 3

Я думаю, что преимущество заключается в кодировании интерфейсов, тестирования и прокси.

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

Это справедливо для Guice, Spring, PicoContainer и всех инфраструктур DI.

Достаточно лаконично?