Google Guice vs. PicoContainer для введення залежностей


100

Моя команда досліджує рамки ін'єкцій залежностей і намагається вирішити між використанням Google-Guice та PicoContainer.

Ми шукаємо декілька речей у наших рамках:

  1. Невеликий слід коду - Що я маю на увазі під невеликим кодовим відбитком, це те, що ми не хочемо мати код сміття для введення залежності скрізь у нашій кодовій базі. Якщо нам потрібно зробити рефактор по дорозі, ми хочемо, щоб це було якомога легше.
  2. Продуктивність - скільки накладних витрат має кожен фреймворк при створенні та введенні об'єктів?
  3. Простота використання - чи існує велика крива навчання? Чи потрібно писати кургани коду, щоб отримати щось просте? Ми хочемо мати якомога менше конфігурації.
  4. Розмір спільноти - Більші громади зазвичай означають, що проект буде надалі підтримуватися. Ми не хочемо використовувати фреймворк та мусимо виправляти власні помилки;) Також на будь-які запитання, які виникають у нас на цьому шляху, можна (сподіваємось) відповісти розробником / користувачем рамки.

Будемо дуже вдячні порівняння двох рамок із переліченими критеріями. Будь-який особистий досвід, який допоможе порівняти це, також був би надзвичайно корисним.

Відмова: Я досить новачок в ін'єкційній залежності, тому вибачте, що я задав питання, яке не стосується цієї дискусії.


Оновлення: Ви також можете розглянути можливість CDI 2.0 - введення контекстів та залежностей для Java . Стандартизовано в JSR 365 станом на 2017-04 роки.
Василь Бурк

Відповіді:


115

Можливо, Ви захочете включити Весну до свого списку розглянутих рамок впорскування залежностей. Ось кілька відповідей на ваші запитання:

З'єднання з рамкою

Pico - Pico прагне відмовити ін’єкцій сетерів, окрім іншого, вашим класам не потрібно знати про Pico. Потрібно знати лише проводку (справедливо для всіх рам DI).

Guice - Guice тепер підтримує стандартні анотації JSR 330 , тому конкретні примітки для Guice вам більше не потрібні. Весна також підтримує ці стандартні примітки. Аргумент, який використовують хлопці Guice, полягає в тому, що без запущеного процесора анотації Guice це не повинно впливати, якщо ви вирішите використовувати інший фреймворк.

Весна - Весна має на меті дозволити вам уникнути будь-якої згадки про весняний фреймворк у своєму коді. Оскільки у них є багато інших помічників / утиліт тощо. Спокуса досить сильна, щоб залежати від Spring коду.

Продуктивність

Піко - я не надто знайомий зі швидкісними характеристиками Піко

Guice - Guice був розроблений таким чином, щоб він був швидким, а порівняння, згадане в посиланні, має деякі цифри. Безумовно, якщо швидкість є першочерговою увагою або за допомогою Guice, або за допомогою електропроводки вручну

Весна - Весна може бути повільною. Була проведена робота з її швидшого використання, а використання бібліотеки JavaConfig повинно прискорити роботу.

Простота використання

Pico - простий у налаштуванні. Pico може прийняти для вас кілька автопровідних рішень. Не зрозуміло, як це стосується дуже великих проектів.

Guice - простий у налаштуванні, ви просто додаєте примітки та успадковуєте від AbstractModule, щоб зв’язувати речі разом. Масштабний масштаб для великих проектів, оскільки конфігурація зводиться до мінімуму.

Spring - відносно простий у налаштуванні, але більшість прикладів використовують Spring XML як метод конфігурації. Весняні XML-файли з часом можуть стати дуже великими та складними та потребують часу для завантаження. Подумайте про використання суміші пружинного та ручного колінчастого впорскування для подолання цього.

Розмір спільноти

Піко - малий

Guice - середній

Весна - велика

Досвід

Піко - Я не мав великого досвіду роботи з Pico, але це не є широко використовуваною основою, тому буде складніше знайти ресурси.

Guice - Guice - це популярна основа, і її спрямованість на швидкість вітається, коли у вас є великий проект, який ви перезапускаєте багато в розробці. У мене є стурбованість розподіленим характером конфігурації, тобто не просто зрозуміти, як складається вся наша програма. У цьому відношенні це трохи схоже на АОП.

Весна - весна, як правило, мій вибір за замовчуванням. Однак, XML може стати громіздким, а уповільнення, яке спричинить роздратування. Я часто в кінцевому підсумку використовую комбінацію розробленого вручну залежної інжекції та пружини. Коли вам справді потрібна конфігурація на основі XML, Spring XML є досить непоганим. Весна також доклала багато зусиль, щоб зробити інші рамки більш сприятливими для ін'єкцій залежностей, що може бути корисним, оскільки вони часто використовують найкращі практики при цьому (JMS, ORM, OXM, MVC тощо).

Список літератури


1
Те, що я дізнався (від когось іншого, а не від того, щоб його самим використовувати), - це те, що PicoContainer має більш легку вагу, ніж Гійс. Крім того, дивлячись на те, що документ PicoContainer, він також здається більш простим у використанні. Він буде шукати залежності в самих конструкторах, і вам не потрібно вказувати, який конструктор використовувати. Він просто використовує відповідний.
Кіссакі

2
Так, я зараз великий на PicoContainer. Це просто таке "просто", але працююче рішення, я не можу не сприймати Весну як роздуту і застарілу в наші дні. Guice також приємний (і має гарну підтримку з Google / Google), але я вважаю, що Pico також має більше можливостей / гнучкості, будучи старшими. Добре бачити приємні альтернативи кепській конфігурації XML!
Маній

Посилаючись на "не широко використовуваний" опис Піко вище, це правда, що він не такий популярний, як інші, але враховуючи, що він менший / простіший за інші рішення, ви набагато рідше зіткнетеся з незвичайними проблемами. Якщо у вас є, є приємний і дуже чуйний список розсилки. Також Pico є неінвазивним (якщо ви не вирішите використовувати анотації, це варіант), вам не потрібні анотації, такі як Guice, що означає менше роботи, що з'єднує інжекційний код. (Так, я упереджений, але Піко такий крутий) Guice, безумовно, хороший інструмент DI (краще, ніж Spring IMO), хоча.
Маній

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

2
Щойно я зробив простий тест на працездатність з Guice / Spring / PicoContainer - Guice та PicoContainer досить схожі. В деяких випадках Гіс був трохи швидшим. Весна була дуже повільною у всіх випадках.
Джошуа Девіс

25

Відповідь, яку висловив jamie.mccrindle, насправді дуже гарна, але я збентежений, чому Spring - це вибір за замовчуванням, коли цілком зрозуміло, що доступні чудові альтернативи (і Pico, і Guice). Популярність IMO Spring досягла свого піку, і зараз вона живе за допомогою генерованого галасу (разом із усіма іншими «я теж» весняними підпроектами, які прагнуть їхати на весняній смузі).

Єдиною реальною перевагою весни є розмір громади (і, чесно кажучи, зважаючи на розмір та складність, це потрібно), проте Піко та Гіс не потребують величезної спільноти, оскільки їх рішення набагато чистіше, організованіше та елегантніше. Pico здається більш гнучким, ніж Guice (ви можете використовувати анотації в Pico, чи ні - це надзвичайно ефективно). (Редагувати: Хочеться сказати, що вона надзвичайно гнучка, не те, що вона також не є ефективною.)

Крихітний розмір Піко і відсутність залежностей - ОСНОВНА перемога, яку не слід занижувати. Скільки мегів вам потрібно завантажити, щоб використовувати Spring зараз? Це безладдя з величезних файлів jar, з усіма залежностями. Інтуїтивно роздумуючи, таке ефективне і «маленьке» рішення повинно масштабуватись та працювати краще, ніж щось на зразок Весна. Чи справді весняне цвітіння покращить масштаб? Це дивний світ? Я б не припускав, що Весна є "більш масштабованою", поки це не доведено (і не пояснено).

Іноді створювати щось хороше (Pico / Guice), а потім утримувати свої ВИМКНЕННЯ від цього замість того, щоб додавати функції розмиву та кухонної мийки з нескінченними новими версіями, справді виходить ...


1
Хочете сказати, чому Піко і Гіс вищі за Весну?
Thorbjørn Ravn Andersen

4
Я подумав, що це так - в основному, вони роблять DI так само добре, вони простіші / менші / чистіші, і немає, або мало залежностей. Це не означає, що Весна ніколи не має сенсу (я впевнений, що є випадки), все, що я говорю, - що простіше краще, якщо ваші вимоги будуть виконані. А для дуже великої кількості проектів, маленькі підказки - це все, що вам потрібно.
Маній

12

ПРИМІТКА. Це скоріше коментар / бурхливість, ніж відповідь

PicoContainer - це чудово. Я б перейшов до нього, якби вони просто виправили свої веб-сайти. Зараз це справді заплутано:

  • http://picocontainer.com - найновіший, але на багатьох сторінках є проблеми із форматуванням, а кілька сторінок взагалі не працюють. Схоже, сторінки були автоматично перетворені зі старого вмісту.
  • http://picocontainer.codehaus.org/ Що здається замерзлим у часі у версії 2.10.2 - Було б дуже приємно, якби на сторінках було сказано щось на кшталт "ей, ти дивишся на старий веб-сайт!"
  • http://docs.codehaus.org/display/PICO/Home - Вікі для злиття, що документує v 1.x, але це не говорить про те, що ніде на сторінках!

Зараз я використовую Guice 2.x, хоча він більший і має менше функцій. Знайти документацію було набагато простіше, і це група користувачів дуже активна. Однак, якщо напрямок Guice 3 є вказівкою, схоже, що Guice починає розквітати, подібно до того, як Весна поверталася в перші дні.

Оновлення: я опублікував коментар перед Pico Container людьми, і вони внесли деякі вдосконалення на веб-сайті. Набагато краще зараз!


Але веб-сайт codehaus все ще заморожений і не має інформації про будь-який крок. Я думав, що Піко мертвий;)
Владислав Раструсний

1
Якщо веб-сайт не в курсі коду, це може свідчити про те, що проект опустився нижче критичної маси.
Thorbjørn Ravn Andersen

@ ThorbjørnRavnAndersen Так. На жаль, я думаю, що Піко витіснили Guice та CDI.
Джошуа Девіс

5
Станом на 8 березня 2013 року, схоже, веб-сайт picocontainer.org займає розсеяний домен. picocontainer.com зараз є канонічним веб-сайтом.
dOxxx

2

Це давнє питання, але сьогодні ви можете розглянути Dagger ( https://github.com/square/dagger ) у вашому проекті для Android App. Dagger робить генерацію коду під час компіляції. Таким чином, ви отримуєте коротший час запуску і менше використання пам'яті на час виконання.


Мені подобається Dagger, але, схоже, ще немає плагіну Gradle в публічних репортах для проектів, що не належать до Android (тобто плагін Gradle для «звичайних» проектів Java). Я б вважав, що це для Java-проектів, якби плагін був у публічних репостах.
Джошуа Девіс

2

Якщо ви користуєтеся мінімалістичним контейнером DI, ви можете перевірити перо . Ванільний JSR-330 DI функціональний, але досить хороший з точки зору сліду (16 КК, відсутність залежностей) та продуктивності. Працює на андроїд.


Гей, перо приголомшливе! Я використовував його для реалізації плагіна DI для ActFramework . Я зробив декілька оновлень, наприклад, автоматично зателефонувавши до ін'єкційних полів, якщо потрібно, та підтримка слухача ін'єкцій, повідомте мені, чи хочете ви, щоб я надіслав запит на тягу
Гелін Луо

@green Я бачу, що ти переїхав до Genie. Чи можете ви поділитися своїм досвідом використання перо?
beerBear

1
@beerBear Перо дуже легке і дуже просте у використанні у більшості випадків використання DI. Однак, оскільки я працюю над fullstack MVC-рамкою, мені потрібно рішення, яке реалізує повну специфікацію JSR330. Тому я переїхав до Genie
Gelin Luo

@green Я ціную ваш пост пояснення, щоб краще зрозуміти.
пивоЗайдіть

0

Хоча мені подобається PicoContainer за її простоту і відсутність залежностей. Я б рекомендував використовувати натомість CDI, оскільки він є частиною стандарту Java EE, тому у вас немає блокування постачальника.

З точки зору настирливості, головна проблема полягає у потребі контейнера та використанні відносно порожнього файлу META-INF / beans.xml (необхідного для вказівки на те, що в банці використовується CDI) та використання анотацій (хоча вони стандартні )

Легкий контейнер CDI, який я використовую для власних проектів, - це Apache Open Web Beans. Хоча знадобилося певний час, щоб розібратися, як створити простий додаток (на відміну від Піко), який виглядає приблизно так.

public static void main(final String[] args) {
    final ContainerLifecycle lifecycle = WebBeansContext.currentInstance()
            .getService(ContainerLifecycle.class);
    lifecycle.startApplication(null);

    final BeanManager beanManager = lifecycle.getBeanManager();
    // replace Tester with your start up class
    final Bean<?> bean = beanManager.getBeans(Tester.class).iterator()
            .next();

    final Tester b = (Tester) lifecycle.getBeanManager().getReference(bean,
            Tester.class, beanManager.createCreationalContext(bean));
    b.doInit();
}

2
Якщо ви дотримуєтеся JSR-330 у вашому коді бібліотеки, ви можете звести конкретний код контейнера до мінімуму.
Thorbjørn Ravn Andersen

Вам все ще потрібен специфічний код контейнера в автоматизованому тестуванні. Хоча це не означає, що у вашому фактичному коді є специфічний для контейнера код (і все одно ви не повинні, якщо ви не плануєте запускати власний "основний", який в одному додатку я написав для себе)
Архімед Траяно
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.