Google Guice vs PicoContainer pour L'Injection de dépendance

Mon équipe recherche des frameworks d'injection de dépendances et essaie de décider entre L'utilisation de Google-Guice et PicoContainer.

Nous recherchons plusieurs choses dans notre cadre:

  1. Une petite empreinte de code-ce que je veux dire par une petite empreinte de code, c'est que nous ne voulons pas avoir de litière de code d'injection de dépendance partout dans notre base de code. Si nous avons besoin de refactoriser sur la route, nous voulons que ce soit aussi facile que possible.
  2. Performance-combien de frais généraux chacun cadre ont lors de la création et l'injection d'objets?
  3. Facilité d'utilisation - faut-il une grande courbe d'apprentissage? Devons-nous écrire des monticules de code pour que quelque chose de simple fonctionne? Nous voulons avoir le moins de configuration possible.
  4. Taille de la collectivité-les collectivités plus grandes signifient généralement qu'un projet continuera d'être maintenu. Nous ne voulons pas utiliser un framework et devons corriger nos propres bugs ;) aussi toutes les questions que nous avons en cours de route peuvent (espérons-Le) être répondues par le framework communauté développeur / utilisateur .

Les comparaisons des deux cadres par rapport aux critères énumérés seraient grandement appréciées. Toute expérience personnelle qui aide à comparer les deux serait également extrêmement utile.

Disclaimer: je suis assez nouveau dans l'injection de dépendance, alors excusez mon noob-ness si je pose une question qui n'est pas pertinente à cette discussion.

97
demandé sur Alexey Romanov 2010-01-08 10:06:00

6 réponses

Vous pouvez inclure Spring dans votre liste de frameworks D'Injection de dépendances que vous envisagez. Voici quelques réponses à vos questions:

Couplage au Cadre

Pico - Pico a tendance à décourager l'injection de setter, mais à part cela, vos classes n'ont pas besoin de savoir sur Pico. C'est seulement le câblage qui doit savoir (vrai pour tous les frameworks DI).

Guice - Guice prend désormais en charge les annotations standard JSR 330, donc vous ne le faites pas besoin d'annotations spécifiques à Guice dans votre code plus. Spring prend également en charge ces annotations standard. L'argument que les gars de Guice utilisent est que sans un processeur d'annotation Guice en cours d'exécution, ceux-ci ne devraient pas avoir d'impact si vous décidez d'utiliser un framework différent.

Printemps - Printemps vise à vous permettre d'éviter toute mention du framework Spring dans votre code. Parce qu'ils ont beaucoup d'autres aides / utilitaires, etc. la tentation est assez forte de dépendre du printemps code.

Performance

Pico - je ne suis pas trop familier avec les caractéristiques de vitesse Pico

Guice - Guice a été conçu pour être rapide et la comparaison mentionnée dans la référence a quelques chiffres. Certes, si la vitesse est une considération primordiale, soit en utilisant Guice ou le câblage à la main devrait être considéré

Printemps - Printemps peut être lent. Il y a eu du travail pour le rendre plus rapide et l'utilisation de la bibliothèque JavaConfig devrait accélérer les choses jusqu'.

Facilité d'utilisation

Pico - Simple à configurer. Pico peut prendre des décisions autowire pour vous. Pas clair comment il s'adapte à de très grands projets.

Guice - Simple à configurer, il vous suffit d'ajouter des annotations et d'hériter de AbstractModule pour lier les choses ensemble. S'adapte bien aux grands projets car la configuration est réduite au minimum.

Spring - relativement facile à configurer, mais la plupart des exemples utilisent Spring XML comme méthode de configuration. Les fichiers XML Spring peuvent devenir très volumineux et complexes au fil du temps et prendre du temps à charger. Envisagez d'utiliser un mélange D'Injection de dépendance à ressort et à manivelle pour surmonter cela.

Taille De La Communauté

Pico - Petit

Guice - Moyenne -

Printemps - Grand

Expérience

Pico - Je n'ai pas eu beaucoup d'expérience avec Pico mais ce n'est pas un cadre largement utilisé, il sera donc plus difficile de trouver des ressources.

Guice - Guice est un framework populaire et son accent sur la vitesse est le bienvenu lorsque vous avez un grand projet que vous redémarrez beaucoup en développement. J'ai une préoccupation au sujet de la nature distribuée de la configuration c'est à dire qu'il n'est pas facile de voir comment notre application est mis en place. C'est un peu comme AOP à cet égard.

Printemps - le Printemps est généralement mon choix par défaut. Cela dit, le XML peut devenir encombrant et le ralentissement qui en résulte ennuyeux. Je finis souvent par utiliser une combinaison de injection et ressort de dépendance fabriqués à la main. Lorsque vous avez réellement besoin D'une configuration basée sur XML, Spring XML est assez bon. Spring a également déployé beaucoup d'efforts pour rendre les autres frameworks plus conviviaux pour L'Injection de dépendances, ce qui peut être utile car ils utilisent souvent les meilleures pratiques (JMS, ORM, OXM, MVC, etc.).

Références

111
répondu Jamie McCrindle 2013-06-18 10:13:16

La réponse mise en place par jamie.mccrindle est en fait assez bon, mais je ne comprends pas pourquoi Spring est le choix par défaut quand il est assez clair que des alternatives supérieures (Pico et Guice) sont disponibles. La popularité D'IMO Spring a atteint son apogée et maintenant il vit actuellement du battage médiatique généré (avec tous les autres sous-projets de printemps "moi aussi"qui cherchent à monter le train en marche du printemps).

Le seul avantage réel du printemps est la taille de la communauté (et franchement, en raison de la taille et la complexité, c'est nécessaire), mais Pico et Guice n'ont pas besoin d'une énorme communauté parce que leur solution est beaucoup plus propre, plus organisée et plus élégante. Pico semble plus flexible que Guice (vous pouvez utiliser des annotations dans Pico, ou pas-c'est extrêmement efficace). (Edit: destiné à dire que c'est extrêmement flexible, pas que ce n'est pas aussi efficace.)

La petite taille et le manque de dépendances de Pico sont une victoire majeure qui ne devrait pas être sous-estimée. Combien de mégas avez-vous besoin de télécharger utiliser le Printemps maintenant? C'est une encombrants gâchis énorme de fichiers jar, avec toutes ses dépendances. Intuitivement, une solution aussi efficace et "petite" devrait évoluer et fonctionner mieux que quelque chose comme Spring. Le ballonnement du printemps va-t-il vraiment améliorer l'échelle? Est-ce bizarro world? Je ne ferais pas d'hypothèses selon lesquelles Spring est "plus évolutif" jusqu'à ce que cela soit prouvé (et expliqué).

Parfois créer quelque chose de bon (Pico / Guice) et ensuite garder vos mains hors de lui au lieu d'ajouter ballonnement et les caractéristiques de l'évier de cuisine avec de nouvelles versions sans fin fonctionnent vraiment...

25
répondu Manius 2010-07-31 18:00:01

NOTE: c'est plus un commentaire / diatribe qu'une réponse

PicoContainer est génial. J'y retournerais s'ils réparaient leurs sites web. C'est vraiment déroutant maintenant:

  • http://picocontainer.com qui est le plus récent, mais de nombreuses pages ont des problèmes de formatage et quelques pages ne fonctionnent pas du tout. Il semble que les pages ont été automatiquement converties à partir de l'ancien contenu.
  • http://picocontainer.codehaus.org / qui semble figé dans le temps à la version 2.10.2 - ce serait vraiment sympa si les pages disaient quelque chose comme " Hé, vous regardez un vieux site web!"
  • http://docs.codehaus.org/display/PICO/Home - Un wiki de confluence qui documente v 1.x, mais ça ne dit pas ça n'importe où sur les pages!

J'utilise Guice 2.x maintenant, même si c'est plus grand, et il a moins de fonctionnalités. Il était juste beaucoup plus facile de trouver la documentation, et son groupe d'utilisateurs est très actif. Toutefois, si l' direction de Guice 3 est une indication, il semble que Guice commence à gonfler, tout comme le printemps a fait le chemin du retour dans les premiers jours.

Mise à jour: j'ai posté un commentaire aux gens de Pico Container et ils ont apporté quelques améliorations au site web. Beaucoup mieux maintenant!

11
répondu Joshua Davis 2013-04-07 11:21:09

C'est une vieille question mais aujourd'hui vous pouvez considérer Dagger ( https://github.com/square/dagger ) dans votre projet D'application Android. Dagger fait la génération de code au moment de la compilation. Ainsi, vous obtenez un temps de démarrage plus court et moins d'utilisation de la mémoire sur le temps d'exécution.

2
répondu A.C.Andreani 2014-01-29 16:40:22

Si vous recherchez un conteneur DI minimaliste, vous pouvez consulter Feather . Vanilla JSR-330 di fonctionnalité seulement, mais assez bon en termes d'empreinte (16K, pas de dépendances) et de performance. Fonctionne sur android.

1
répondu Cellux 2015-09-30 12:13:38

Bien que J'aime PicoContainer pour sa simplicité et son manque de dépendances. Je recommanderais D'utiliser CDI à la place car il fait partie de la norme Java EE, donc vous n'avez pas de verrouillage du fournisseur.

En termes d'intrusion, son principal problème est l'exigence d'un conteneur et l'utilisation d'un META-INF/beans relativement vide.fichier xml (nécessaire pour indiquer que le jar utilise CDI) et l'utilisation d'annotations (bien qu'elles soient standard)

Le conteneur CDI léger que j'utilise pour mes propres projets est Apache Open Web Beans. Bien qu'il ait fallu un certain temps pour comprendre comment créer une application simple (contrairement à Pico) qui ressemble à ceci.

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();
}
0
répondu Archimedes Trajano 2012-10-22 10:51:59