Mon équipe recherche des frameworks d'injection de dépendances et essaie de décider entre l'utilisation de Google-Guice et de PicoContainer.
Nous recherchons plusieurs éléments dans notre cadre:
Des comparaisons des deux cadres avec les critères énumérés seraient grandement appréciées. Toute expérience personnelle qui aiderait à comparer les deux serait également extrêmement utile.
Avis de non-responsabilité: Je suis relativement nouveau dans l'injection de dépendances, alors excusez-moi si je pose une question qui n'est pas pertinente pour cette discussion.
Vous voudrez peut-être inclure Spring dans votre liste de cadres d'injection de dépendance que vous envisagez. Voici quelques réponses à vos questions:
Pico - Pico a tendance à décourager l'injection de setter mais à part ça, vos classes n'ont pas besoin de connaître Pico. Ce n'est que le câblage qui doit être connu (vrai pour tous les cadres DI).
Guice - Guice prend désormais en charge les annotations standard JSR 3 , vous n'avez donc plus besoin d'annotations spécifiques à Guice dans votre code. 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.
Spring - Spring a pour but de 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 code Spring, cependant.
Pico - Je ne connais pas trop les caractéristiques de vitesse de 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, soit en câblant à la main,
Printemps - Le 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.
Pico - Simple à configurer. Pico peut prendre des décisions de câblage automatique pour vous. Pas clair comment il évolue vers 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 ce problème.
Pico - Petit
Guice - Moyen
Ressort - Large
Pico - Je n'ai pas beaucoup d'expérience avec Pico mais ce n'est pas un framework largement utilisé donc il sera plus difficile de trouver des ressources.
Guice - Guice est un framework populaire et l'accent mis sur la vitesse est le bienvenu lorsque vous avez un grand projet que vous redémarrez beaucoup en cours de développement. Je suis préoccupé par la nature distribuée de la configuration, c'est-à-dire qu'il n'est pas facile de voir comment l'ensemble de notre application est composée. C'est un peu comme AOP à cet égard.
Spring - Spring est généralement mon choix par défaut. Cela dit, le XML peut devenir lourd et le ralentissement qui en résulte ennuyeux. Je finis souvent par utiliser une combinaison d'injection de dépendance fabriquée à la main et de ressort. 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 d'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.).
La réponse proposée par jamie.mccrindle est en fait assez bonne, mais je ne comprends pas pourquoi Spring est le choix par défaut quand il est assez clair que des alternatives supérieures (à la fois 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 "moi aussi" Spring qui cherchent à monter dans le train du printemps).
Le seul véritable avantage de Spring est la taille de la communauté (et franchement, en raison de la taille et de la complexité, c'est nécessaire), mais Pico et Guice n'ont pas besoin é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 non - c'est extrêmement efficace). (Edit: Signifie que c'est extrêmement flexible, pas qu'il n'est pas aussi efficace.)
La petite taille et le manque de dépendances de Pico est une victoire MAJEURE à ne pas sous-estimer. Combien de mégas devez-vous télécharger pour utiliser Spring maintenant? C'est un kludgy-mess d'énormes fichiers jar, avec toutes ses dépendances. Pensée de manière intuitive, une solution aussi efficace et "petite" devrait évoluer et fonctionner mieux que quelque chose comme Spring. Le ballonnement de Spring va-t-il vraiment améliorer l'échelle? Est-ce que ce monde bizarro? Je ne ferais pas d'hypothèse que Spring est "plus évolutif" jusqu'à ce que cela soit prouvé (et expliqué).
Parfois, créer quelque chose de bien (Pico/Guice), puis garder vos mains hors de lui au lieu d'ajouter des fonctionnalités de ballonnement et d'évier de cuisine avec de nouvelles versions sans fin fonctionne vraiment ...
REMARQUE: il s'agit plus d'un commentaire/d'une diatribe que d'une réponse
PicoContainer est génial. Je reviendrais dessus s'ils voulaient simplement réparer leurs sites Web. C'est vraiment déroutant maintenant:
J'utilise Guice 2.x maintenant, même s'il est plus grand et qu'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. Cependant, si la direction de Guice 3 est une indication, il semble que Guice commence à gonfler, tout comme le printemps l'a fait au début.
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 !
C'est une vieille question, mais aujourd'hui, vous pouvez envisager Dagger ( https://github.com/square/dagger ) dans votre Android App. Dagger fait la génération de code sur le temps de compilation. Vous obtenez donc un temps de démarrage plus court et moins d’utilisation de la mémoire sur le temps d’exécution.
Si vous recherchez un conteneur DI minimaliste, vous pouvez consulter Feather . Vanilla JSR-330 DI uniquement, mais assez bonne en termes d'encombrement (16K, pas de dépendances) et de performances. Fonctionne sur Android.
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), vous n'avez donc pas de verrouillage du fournisseur.
En termes d'intrusion, son principal problème est l'exigence d'un conteneur et l'utilisation d'un fichier META-INF/beans.xml relativement vide (nécessaire pour indiquer que le pot 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();
}