Frage

Mein Team forscht Dependency Injection-Frameworks und versucht, zwischen der Verwendung von Google-Guice und PicoContainer zu entscheiden.

Wir suchen mehrere Dinge in unserem Rahmen:

  1. Ein kleiner Code-Fußabdruck - Was ich durch eine kleine Code-Fußabdruck meine ist, wir wollen nicht, Dependency Injection Code Wurf überall in unserer Code-Basis haben. Wenn wir den Weg nach unten Refactoring benötigen, wollen wir es so einfach wie möglich sein.
  2. Performance - Wie viel Aufwand ist jeder Rahmen haben bei der Erstellung und Injizieren von Objekten
  3. Einfache Bedienung - Gibt es eine große Lernkurve? Müssen wir Berge von Code schreiben, etwas einfach zum Laufen zu bringen? Wir wollen so wenig Konfiguration wie möglich haben.
  4. Community Größe - Größere Gemeinden in der Regel bedeutet, dass ein Projekt beibehalten werden wird fortgesetzt. Wir wollen nicht, einen Rahmen verwenden und haben unsere eigenen Fehler zu beheben;). Auch alle Fragen, die wir auf dem Weg haben kann (hoffentlich) durch den Rahmen des Entwickler / Anwender-Community beantwortet werden

Vergleiche der beiden Frameworks gegen die genannten Kriterien würden sehr geschätzt. Alle persönlichen Erfahrungen, die die beiden vergleichen helfen würde auch sehr hilfreich sein.

Disclaimer: Ich bin ziemlich neu Injektion der Abhängigkeits so meine Noob-ness entschuldigen, wenn ich eine Frage gestellt, die nicht relevant für diese Diskussion ist.

War es hilfreich?

Lösung

Sie möchten Frühling enthalten in der Liste der Dependency Injection-Frameworks Sie erwägen. Hier sind einige Antworten auf Ihre Fragen:

Die Kopplung an den Rahmen

Pico - Pico Setter Injektion aber anders als das entmutigen neigt, Ihre Klassen müssen nicht über Pico kennen. Es ist nur die Verdrahtung, die (gilt für alle DI-Frameworks) wissen muss.

Guice - Guice unterstützt nun den Standard JSR 330 Anmerkungen, so dass Sie nicht brauchen Guice spezifische Anmerkungen im Code mehr. Frühling unterstützt auch diese Standard-Annotationen. Das Argument, die Guice Jungs verwenden, dass ohne eine Guice Annotation Prozessor läuft, sollten diese keine Auswirkungen haben, wenn Sie einen anderen Rahmen verwenden entscheiden.

Frühling - Frühling soll Ihnen jede Erwähnung des Spring-Framework in Ihrem Code zu vermeiden, ermöglichen. Weil sie viele andere Helfer / Dienstprogramme tun haben usw. die Versuchung ziemlich stark ist auf Frühling Code abhängen, though.

Performance

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

Guice - wurde Guice entwickelt, um schnell und der Vergleich in der Referenz erwähnt hat einige Zahlen. Sicherlich, wenn Geschwindigkeit ist eine vorrangige Erwägung entweder mit Guice oder Verdrahtung von Hand sollte in Betracht gezogen werden

Frühling - Frühling kann langsam sein. Es gab Arbeit schneller zu machen und die JavaConfig Bibliothek verwenden, sollte die Dinge beschleunigen.

Einfache Bedienung

Pico - Einfach zu konfigurieren. Pico können einige autowire Entscheidungen für Sie treffen. Nicht klar, wie es skaliert auf sehr große Projekte.

Guice - Einfach zu konfigurieren, fügen Sie nur Annotationen und erben von AbstractModule Dinge zusammen zu binden. Waagen auch für Großprojekte als Konfiguration auf ein Minimum gehalten wird.

Frühling - relativ einfach zu konfigurieren, aber die meisten Beispiele verwenden Spring-XML als Methode für die Konfiguration. Spring-XML-Dateien können sehr groß und komplex im Laufe der Zeit und nehmen Sie sich Zeit zu laden. Betrachten Sie mit einer Mischung aus Frühling und Handkurbel Dependency Injection, dies zu überwinden.

Community Größe

Pico - Kleine

Guice - Medium

Frühling - Large

Erfahrung

Pico -. Ich habe nicht viel Erfahrung mit Pico hatte, aber es ist nicht ein weit verbreitetes Rahmen so wird es schwieriger zu finden, Ressourcen

Guice - Guice ist ein beliebter Rahmen und sein Fokus auf Geschwindigkeit ist willkommen, wenn Sie ein großes Projekt haben, dass Sie viel in der Entwicklung sind neu zu starten. Ich habe eine Besorgnis über die verteilte Natur der Konfiguration das heißt es ist nicht leicht zu sehen, wie unsere gesamte Anwendung zusammengesetzt ist. Es ist ein bisschen wie AOP in dieser Hinsicht.

Frühling - Der Frühling ist in der Regel meine Standard-Wahl. Das heißt, kann die XML werden umständlich und die daraus resultierende Verlangsamung ärgerlich. Ich am Ende oft eine Kombination aus handgearbeiteter Dependency Injection und Frühling verwenden. Wenn Sie tatsächlich XML-basierte Konfiguration benötigen, ist Spring-XML recht gut. Frühling legen auch sehr viel Mühe in die Herstellung anderer Frameworks mehr Dependency Injection freundlich, die nützlich sein können, weil sie oft am besten Praxis verwenden, wenn dabei (JMS, ORM, OXM, MVC usw.).

Referenzen

Andere Tipps

Die Antwort von jamie.mccrindle setzen ist eigentlich ziemlich gut, aber ich bin verwirrt links warum Frühling die Standardeinstellung ist, wenn es ist ziemlich klar, dass überlegene Alternativen (beide Pico und Guice) zur Verfügung stehen. IMO Spring Popularität erreicht hat, es ist Spitze und jetzt ist es zur Zeit der erzeugten Hype leben von (zusammen mit allen anderen „me too“ Spring Unterprojekte, die sich Frühling fahrenden Zug fahren).

Spring einziger wirklicher Vorteil Gemeindegröße (und ehrlich gesagt, aufgrund der Größe und Komplexität, ist es erforderlich), aber Pico und Guice nicht Notwendigkeit eine große Gemeinschaft, weil ihre Lösung ist viel saubere , besser organisiert und eleganter. Pico scheint flexibler als Guice (Annotationen in Pico verwenden oder nicht - es ist äußerst effizient). (Edit: Meant to sagen, es ist extrem flexibel, nicht, dass es nicht auch effizient ist.)

Pico winzige Größe und der Mangel an Abhängigkeiten ist ein großer Gewinn, der sollte nicht unterschätzt. Wie viele megs brauchen Sie zum Download Frühling verwenden jetzt? Es ist ein kludgy-Durcheinander von großen JAR-Dateien, mit all Abhängigkeiten ist. Intuitiv zu denken, wie eine effiziente und „kleine“ Lösung sollte skalieren und besser als so etwas wie Frühling. Ist Spring aufblasen gehen, um wirklich machen es besser zu skalieren? Ist die bizarro Welt? Ich würde nicht Annahmen, dass Spring „skalierbarer“ ist, bis das bewährte (und erklärt).

Manchmal etwas zu schaffen, gut (Pico / Guice) und dann Ihre Hände weg davon zu halten, anstatt wirklich mit immer neuen Versionen aufblasen und Küchenspüle des Hinzufügen von Funktionen nicht funktionieren ...

Hinweis: Dies ist eher ein Kommentar / rant als eine Antwort

PicoContainer ist groß. Ich würde wechseln, um es zurück, wenn sie nur ihre Websites beheben würde. Es ist wirklich verwirrend jetzt:

  • http://picocontainer.com , die die neuesten, aber viele Seiten haben Formatierungsprobleme und ein paar Seiten nicht funktionieren überhaupt . Es sieht aus wie die Seiten wurden automatisch umgewandelt aus dem älteren Inhalt.
  • http://picocontainer.codehaus.org/ die in der Zeit in der Version 2.10.2 eingefroren scheint - Es wäre wirklich schön , wenn die Seiten sagen etwas wie: „hey, ich bin in einer alten Website suchen!“
  • http://docs.codehaus.org/display/PICO/Home - Ein Zusammen Wiki, dass Dokumente v 1.x, aber es sagt nicht, dass überall auf den Seiten!

Ich bin mit Guice 2.x jetzt, obwohl es größer, und es hat weniger Funktionen. Es war nur viel einfacher, die Dokumentation zu finden, und es ist Benutzergruppe sehr aktiv ist. wenn die Richtung der Guice 3 jedoch jede Angabe, es sieht aus wie Guice beginnt zu aufblasen, wie Frühling Weg zurück in den frühen Tagen.

Update: Ich schrieb einen Kommentar zu den Pico Container Leute und sie haben einige Verbesserungen an der Website vorgenommen. Viel besser jetzt!

Es ist eine alte Frage, aber heute kann man Dagger betrachten können ( https://github.com/square/dagger ) in Ihrem Projekt Android App. Dagger tut Codegenerierung auf der Kompilierung. So erhalten Sie eine kürzere Startzeit und weniger Speicherverbrauch auf Ausführungszeit.

Wenn Sie nach einem minimalistischen DI-Container sind, können Sie überprüfen Feder . Vanilla JSR-330 DI-Funktionalität nur, aber ganz gut in Bezug auf Stellfläche (16K, keine Abhängigkeiten) und Leistung. Funktioniert auf Android.

Obwohl ich wie PicoContainer tun für sie Einfachheit und es ist Mangel an Abhängigkeiten. Ich würde mit CDI stattdessen empfehlen, weil es einem Teil des Java EE-Standard ist, so dass Sie keine Vendor Lock-in haben.

Im Hinblick auf der Aufdringlichkeit, ist es Hauptproblem ist die Anforderung eines Behälters und die Verwendung einer relativ leeren META-INF / beans.xml-Datei (benötigt, um anzuzeigen, dass das Gefäß wird mit CDI) und die Verwendung von Anmerkungen (obwohl sie sind Standard)

Der leichte CDI Behälter ich für meine eigenen Projekte verwenden ist Apache Open Web Beans. Obwohl es dauerte eine Weile, um herauszufinden, wie eine einfache Anwendung zu schaffen (im Gegensatz zu Pico), die wie folgt 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();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top