Google Guice vs. PicoContainer für Abhängigkeitsinjektion

100

Mein Team erforscht Frameworks für die Abhängigkeitsinjektion und versucht, sich zwischen der Verwendung von Google-Guice und PicoContainer zu entscheiden.

Wir suchen verschiedene Dinge in unserem Rahmen:

  1. Ein kleiner Code-Footprint - Was ich unter einem kleinen Code-Footprint verstehe, ist, dass wir nicht überall in unserer Codebasis Abhängigkeitsinjektionscode-Abfall haben möchten. Wenn wir die Straße später umgestalten müssen, möchten wir, dass es so einfach wie möglich ist.
  2. Leistung - Wie viel Overhead hat jedes Framework beim Erstellen und Einfügen von Objekten?
  3. Benutzerfreundlichkeit - Gibt es eine große Lernkurve? Müssen wir eine Menge Code schreiben, damit etwas Einfaches funktioniert? Wir wollen so wenig Konfiguration wie möglich haben.
  4. Community-Größe - Größere Communities bedeuten normalerweise, dass ein Projekt weiterhin gepflegt wird. Wir wollen kein Framework verwenden und müssen unsere eigenen Fehler beheben;) Auch alle Fragen, die wir auf dem Weg haben, können (hoffentlich) von der Entwickler- / Benutzergemeinschaft des Frameworks beantwortet werden.

Vergleiche der beiden Frameworks mit den aufgeführten Kriterien wären sehr willkommen. Alle persönlichen Erfahrungen, die helfen, die beiden zu vergleichen, wären ebenfalls äußerst hilfreich.

Haftungsausschluss: Ich bin ziemlich neu in der Abhängigkeitsinjektion. Entschuldigen Sie meine Unaufrichtigkeit, wenn ich eine Frage stelle, die für diese Diskussion nicht relevant ist.

austen
quelle
Update: Möglicherweise möchten Sie auch CDI 2.0 - Contexts & Dependency Injection für Java in Betracht ziehen . Standardisiert in JSR 365 ab 2017-04.
Basil Bourque

Antworten:

115

Möglicherweise möchten Sie Spring in Ihre Liste der von Ihnen in Betracht gezogenen Abhängigkeitsinjektions-Frameworks aufnehmen. Hier einige Antworten auf Ihre Fragen:

Kopplung an das Framework

Pico - Pico neigt dazu, die Setter-Injektion zu unterbinden, aber ansonsten müssen Ihre Klassen nichts über Pico wissen. Es muss nur die Verkabelung wissen (gilt für alle DI-Frameworks).

Guice - Guice unterstützt jetzt die Standard- JSR 330- Annotationen, sodass Sie keine Guice-spezifischen Annotationen mehr in Ihrem Code benötigen. Spring unterstützt auch diese Standardanmerkungen. Das Argument, das die Guice-Leute verwenden, ist, dass diese ohne einen Guice-Annotationsprozessor keine Auswirkungen haben sollten, wenn Sie sich für ein anderes Framework entscheiden.

Spring - Spring soll es Ihnen ermöglichen, das Spring-Framework in Ihrem Code nicht zu erwähnen. Da sie viele andere Helfer / Dienstprogramme usw. haben, ist die Versuchung jedoch ziemlich groß, vom Spring-Code abhängig zu sein.

Performance

Pico - Ich bin mit den Geschwindigkeitseigenschaften von Pico nicht allzu vertraut

Guice - Guice wurde entwickelt, um schnell zu sein, und der in der Referenz erwähnte Vergleich hat einige Zahlen. Wenn die Geschwindigkeit im Vordergrund steht, sollte entweder Guice oder die Verkabelung von Hand in Betracht gezogen werden

Frühling - Frühling kann langsam sein. Es wurde daran gearbeitet, es schneller zu machen, und die Verwendung der JavaConfig-Bibliothek sollte die Dinge beschleunigen.

Benutzerfreundlichkeit

Pico - Einfach zu konfigurieren. Pico kann einige Autodrahtentscheidungen für Sie treffen. Nicht klar, wie es auf sehr große Projekte skaliert.

Guice - Einfach zu konfigurieren, fügen Sie einfach Anmerkungen hinzu und erben von AbstractModule, um die Dinge miteinander zu verbinden. Skaliert gut auf große Projekte, da die Konfiguration auf ein Minimum beschränkt ist.

Spring - Relativ einfach zu konfigurieren, aber die meisten Beispiele verwenden Spring XML als Konfigurationsmethode. Spring XML-Dateien können im Laufe der Zeit sehr groß und komplex werden und das Laden einige Zeit in Anspruch nehmen. Verwenden Sie eine Mischung aus Feder und handgekurbelter Abhängigkeitsinjektion, um dies zu überwinden.

Gemeinschaftsgröße

Pico - Klein

Guice - Mittel

Frühling - groß

Erfahrung

Pico - Ich habe nicht viel Erfahrung mit Pico, aber es ist kein weit verbreitetes Framework, daher wird es schwieriger sein, Ressourcen zu finden.

Guice - Guice ist ein beliebtes Framework und sein Fokus auf Geschwindigkeit ist willkommen, wenn Sie ein großes Projekt haben, das Sie in der Entwicklung häufig neu starten. Ich habe Bedenken hinsichtlich der Verteilung der Konfiguration, dh es ist nicht leicht zu erkennen, wie unsere gesamte Anwendung zusammengesetzt ist. In dieser Hinsicht ist es ein bisschen wie AOP.

Frühling - Frühling ist normalerweise meine Standardwahl. Das XML kann jedoch umständlich und die daraus resultierende Verlangsamung ärgerlich werden. Am Ende verwende ich oft eine Kombination aus handgefertigter Abhängigkeitsinjektion und Feder. Wenn Sie tatsächlich eine XML-basierte Konfiguration benötigen, ist Spring XML recht gut. Spring hat auch große Anstrengungen unternommen, um andere Frameworks für Dependency Injection benutzerfreundlicher zu machen. Dies kann nützlich sein, da sie dabei häufig bewährte Methoden verwenden (JMS, ORM, OXM, MVC usw.).

Verweise

Jamie McCrindle
quelle
1
Was ich gelernt habe (von jemand anderem, anstatt es selbst zu verwenden), ist, dass PicoContainer leichter ist als Guice. Wenn man sich das PicoContainer-Dokument ansieht, scheint es auch einfacher zu sein. Es wird nach Abhängigkeiten in den Konstruktoren selbst gesucht und Sie müssen nicht angeben, welcher Konstruktor verwendet werden soll. Es wird nur eine passende verwendet.
Kissaki
2
Ja, ich bin jetzt selbst groß auf PicoContainer. Es ist nur eine solche "Keep it simple" - und dennoch funktionierende Lösung. Ich kann nicht anders, als Spring heutzutage als aufgebläht und veraltet anzusehen. Guice ist auch nett (und hat einen guten Unterstützer mit Google), aber ich glaube, Pico hat auch mehr Funktionen / Flexibilität, da er älter ist. Es ist gut, nette Alternativen zur bösen XML-Konfiguration zu sehen!
Manius
In Bezug auf die "nicht weit verbreitete" Beschreibung von Pico oben ist es wahr, dass es nicht so beliebt ist wie die anderen, aber wenn man bedenkt, dass es kleiner / einfacher als andere Lösungen ist, ist es viel weniger wahrscheinlich, dass Sie auf ungewöhnliche Probleme stoßen. Wenn Sie dies tun, gibt es eine schöne und sehr reaktionsschnelle Mailingliste. Außerdem ist Pico nicht invasiv (es sei denn, Sie entscheiden sich für die Verwendung von Anmerkungen, dies ist eine Option). Sie benötigen keine Anmerkungen wie Guice, was weniger Arbeit bei der Verkabelung des Injektionscodes bedeutet. (Ja, ich bin voreingenommen, aber Pico ist einfach so cool.) Guice ist sicherlich ein gutes DI-Tool (besser als Spring IMO).
Manius
1
Ich verwende Pico in einer Reihe sehr großer (und stark genutzter) Projekte (Hunderte von Komponententypen, die in jedem Container definiert sind) und habe fast alle seine verschiedenen Funktionen verwendet und könnte nicht zufriedener damit sein.
Haus
2
Ich habe gerade einen einfachen Leistungstest mit Guice / Spring / PicoContainer durchgeführt - Guice und PicoContainer sind ziemlich ähnlich. In einigen Fällen war Guice etwas schneller. Der Frühling war in allen Fällen sehr langsam.
Joshua Davis
25

Die Antwort von jamie.mccrindle ist eigentlich ziemlich gut, aber ich bin verwirrt, warum Spring die Standardauswahl ist, wenn ziemlich klar ist, dass überlegene Alternativen (sowohl Pico als auch Guice) verfügbar sind. Die Popularität von IMO Spring hat ihren Höhepunkt erreicht und lebt derzeit vom generierten Hype (zusammen mit all den anderen "Ich auch" Spring-Subprojekten, die den Spring-Zug fahren wollen).

Spring einziger wirklicher Vorteil ist Gemeindegröße (und ehrlich gesagt, aufgrund der Größe und Komplexität, es gebraucht wird ), aber Pico und Guice nicht benötigen eine große Gemeinschaft , weil ihre Lösung viel sauberer ist, besser organisiert und eleganter. Pico scheint flexibler zu sein als Guice (Sie können Anmerkungen in Pico verwenden oder nicht - es ist äußerst effizient). (Bearbeiten: Bedeutet, dass es extrem flexibel ist, nicht, dass es nicht auch effizient ist.)

Picos winzige Größe und das Fehlen von Abhängigkeiten sind ein großer Gewinn, der nicht zu unterschätzen ist. Wie viele Megabyte müssen Sie herunterladen, um Spring jetzt nutzen zu können? Es ist ein Durcheinander riesiger JAR-Dateien mit all ihren Abhängigkeiten. Intuitiv zu denken, sollte eine solch effiziente und "kleine" Lösung skalieren und eine bessere Leistung erbringen als etwas wie Spring. Wird das Aufblähen des Frühlings die Skalierung wirklich verbessern? Ist das eine bizarre Welt? Ich würde nicht davon ausgehen, dass Spring "skalierbarer" ist, bis dies bewiesen (und erklärt) ist.

Manchmal funktioniert es wirklich, etwas Gutes zu kreieren (Pico / Guice) und dann die HÄNDE davon fernzuhalten, anstatt Funktionen zum Aufblähen und Spülen mit endlosen neuen Versionen hinzuzufügen ...

Manius
quelle
1
Möchten Sie sagen, warum Pico und Guice dem Frühling überlegen sind?
Thorbjørn Ravn Andersen
4
Ich dachte, ich hätte es getan - im Grunde tun sie DI genauso gut, sie sind einfacher / kleiner / sauberer und keine oder nur wenige Abhängigkeiten. Das heißt nicht, dass der Frühling niemals Sinn macht (ich bin sicher, es gibt Fälle). Ich sage nur, dass einfacher besser ist, wenn Ihre Anforderungen erfüllt werden. Und für eine sehr große Anzahl von Projekten sind nur kleine Support-Bibliotheken erforderlich.
Manius
12

HINWEIS: Dies ist eher ein Kommentar als eine Antwort

PicoContainer ist großartig. Ich würde wieder darauf zurückgreifen, wenn sie nur ihre Websites reparieren würden. Es ist jetzt wirklich verwirrend:

  • http://picocontainer.com ist die neueste, aber viele Seiten haben Formatierungsprobleme und einige Seiten funktionieren überhaupt nicht. Es sieht so aus, als ob die Seiten automatisch aus dem älteren Inhalt konvertiert wurden.
  • http://picocontainer.codehaus.org/ Was in Version 2.10.2 eingefroren zu sein scheint - Es wäre wirklich schön, wenn auf den Seiten so etwas wie "Hey, Sie sehen sich eine alte Website an!"
  • http://docs.codehaus.org/display/PICO/Home - Ein Zusammenfluss-Wiki, das v 1.x dokumentiert, aber nirgendwo auf den Seiten steht!

Ich verwende jetzt Guice 2.x, obwohl es größer ist und weniger Funktionen hat. Es war einfach viel einfacher, die Dokumentation zu finden, und die Benutzergruppe ist sehr aktiv. Wenn jedoch die Richtung von Guice 3 ein Hinweis ist, sieht es so aus, als würde Guice langsam aufblähen, so wie es der Frühling in den frühen Tagen getan hat.

Update: Ich habe einen Kommentar zu den Pico Container-Leuten gepostet und sie haben einige Verbesserungen an der Website vorgenommen. Viel besser jetzt!

Joshua Davis
quelle
Aber die Codehaus-Website ist immer noch eingefroren und es gibt keine Informationen über einen Umzug. Ich dachte, Pico ist tot;)
Vladislav Rastrusny
1
Wenn die Website nicht mit dem Code auf dem neuesten Stand ist, kann dies ein Hinweis darauf sein, dass das Projekt die kritische Masse unterschritten hat.
Thorbjørn Ravn Andersen
@ ThorbjørnRavnAndersen Ja. Leider denke ich, dass Pico von Guice und CDI abgelöst wurde.
Joshua Davis
5
Ab dem 8. März 2013 scheint die Website picocontainer.org von einem Domainbesetzer besetzt zu sein. picocontainer.com scheint jetzt die kanonische Website zu sein.
dOxxx
2

Es ist eine alte Frage, aber heute können Sie Dolch ( https://github.com/square/dagger ) in Ihrem Android App-Projekt berücksichtigen . Dagger generiert Code zur Kompilierungszeit. So erhalten Sie eine kürzere Startzeit und weniger Speicherbedarf bei der Ausführung.

ACAndreani
quelle
Ich mag Dagger, aber es scheint, dass es in den öffentlichen Repos für Nicht-Android-Projekte noch kein Gradle-Plugin gibt (dh ein Gradle-Plugin für "normale" Java-Projekte). Ich würde es für Java-Projekte in Betracht ziehen, wenn es ein Plugin in den öffentlichen Repos gäbe.
Joshua Davis
2

Wenn Sie nach einem minimalistischen DI-Container suchen, können Sie sich Feather ansehen . Nur Vanilla JSR-330 DI-Funktionalität, aber recht gut in Bezug auf Platzbedarf (16 KB, keine Abhängigkeiten) und Leistung. Funktioniert auf Android.

Cellux
quelle
Hey, Feather ist großartig! Ich habe es verwendet, um ein DI-Plugin für ActFramework zu implementieren . Ich habe ein paar Updates durchgeführt, z. B. bei Bedarf automatisch injizierenFields aufrufen und den Injection Listener unterstützen. Lassen Sie mich wissen, wenn ich eine Pull-Anfrage
zurücksenden soll
@green Ich sehe, du bist zu Genie gezogen. Könnten Sie bitte Ihre Erfahrungen mit Feather teilen?
BeerBear
1
@beerBear Feather ist sehr leicht und in den meisten DI-Anwendungsfällen sehr einfach zu verwenden. Da ich jedoch an einem Fullstack-MVC-Framework arbeite, benötige ich eine Lösung, die die vollständige JSR330-Spezifikation implementiert. Deshalb bin ich
Gelin Luo gezogen
@green Ich freue mich über Ihren Beitrag zur Erklärung, um ein besseres Verständnis zu erhalten.
BierBär
0

Obwohl ich PicoContainer wegen seiner Einfachheit und des Mangels an Abhängigkeiten mag. Ich würde empfehlen, stattdessen CDI zu verwenden, da es Teil des Java EE-Standards ist, sodass Sie keine Lieferantenbindung haben.

In Bezug auf die Eindringlichkeit besteht das Hauptproblem in der Anforderung eines Containers und der Verwendung einer relativ leeren META-INF / beans.xml-Datei (erforderlich, um anzuzeigen, dass das Jar CDI verwendet) und in der Verwendung von Anmerkungen (obwohl diese Standard sind) )

Der leichtgewichtige CDI-Container, den ich für meine eigenen Projekte verwende, ist Apache Open Web Beans. Es hat jedoch eine Weile gedauert, um herauszufinden, wie man eine einfache App erstellt (im Gegensatz zu Pico), die so aussieht.

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();
}
Archimedes Trajano
quelle
2
Wenn Sie in Ihrem Bibliothekscode bei JSR-330 bleiben, können Sie den container-spezifischen Code auf ein Minimum beschränken.
Thorbjørn Ravn Andersen
Sie benötigen weiterhin container-spezifischen Code für Ihre automatisierten Tests. Dies bedeutet jedoch nicht, dass Ihr eigentlicher Code container-spezifischen Code enthalten würde (und Sie sollten es sowieso nicht tun, es sei denn, Sie planen, Ihr eigenes "main" auszuführen, was ich in einer App, die ich für mich selbst geschrieben habe, getan habe.
Archimedes Trajano