2009-08-26 4 views
6

Nous devons fondamentalement être en mesure d'ajuster le comportement au démarrage, en fournissant les classes désirées à produire par diverses usines au sein de notre application (pour éviter la liaison dure du «nouvel» opérateur). Je suis conscient que cela est fourni par plusieurs grands frameworks, mais je cherchais quelque chose facilement utilisable par une application Java autonome sans être gigantesque.Existe-t-il un cadre simple permettant l'injection de dépendances dans un programme autonome?

Des suggestions? Edit: Il est de mon expérience que les cadres ont tendance à grossir dans le cadre de la maturation (et aussi complexe). J'ai besoin que ceci soit rétrofittable à une application héritée dans le cadre du refactoring important (dette technique), ainsi la simplicité est essentielle des bibliothèques utilisées. Cela ne me dérange pas d'avoir à faire un peu de codage dans notre application, mais il doit être très visible ce qui se passe. L'AOP a tendance à déplacer des objets, ce qui peut rendre l'application plus difficile à maintenir.


Modifier: Nous avons maintenant atteint le point où nous avons réellement besoin de prendre une décision. L'application va probablement vivre pendant des décennies, nous devons donc prendre une décision réversible avec un cadre qui sera maintenu pour espérer aussi longtemps. J'aime vraiment la vérification de type statique disponible avec Guice, mais pas que les annotations se lient explicitement à Guice au lieu d'être externes comme au printemps. J'aime aussi que le code semble être plus concis quand on utilise Guice par opposition à Spring. Nous avons besoin de quelque chose de solide et d'utile. Nous n'avons pas besoin de plus que DI pour le moment. Y a-t-il un cas d'utilisation que dit définitivement aller pour l'un d'entre eux?


Modifier 2011-07-27: La décision finale était d'utiliser l'API JSR-330 dans le code, et choisissez sur une base par projet si à utiliser Spring, Guice ou de soudure. Pour les applications autonomes, Guice a bien fonctionné en ce qui concerne l'implémentation JSR-330.

Répondre

5

Avez-vous regardé le framework Google Guice? Il est assez léger et basé sur les annotations, évitant XML fichiers de configuration

Il y a aussi Pico- and Nano-container (de Codehaus) qui sont tout à fait léger, bien que la dernière fois que je regardais (certes il y a quelques années) la documentation faisait défaut.

Je dois dire que je suis d'accord avec les autres sur ce que je suppose est votre présomption que le printemps est massif et déroutant. C'est vraiment un conteneur IoC très simple et à recommander.

+0

j'utiliser Spring pour le câblage mes applications clientes. – pjp

+0

Nous avons décidé pour Guice pour l'instant, puis migrer vers JSR-330 quand il y a plus d'une implémentation. –

2

Il y a un couple que je connais peut vous être utile:

J'ai trouvé Plexus très utile dans les applications autonomes comme il a des composants utilitaires optionnels pour l'interaction CLI.

+0

+1 pour picocontainer – flybywire

7

Vous pouvez toujours utiliser Spring Framework 2.5. C'est un gros problème, mais si vous envisagez de n'utiliser que DI, vous pouvez utiliser des modules spring-core et spring-beans, qui sont assez petits (environ 500KB et 300KB).

Il y a aussi Google Guice 2.0 qui vient avec un paquet avec seulement des choses de base (pas d'AOP) et c'est 430KB.

+2

Je pense que vous avez aussi besoin de spring-context. Et l'exploitation des communs? –

1

Par "gigantesque" Je vais supposer que vous faites référence au printemps, mais c'est injuste, car vous pouvez choisir les morceaux de printemps que vous voulez utiliser. Si tout ce dont vous avez besoin est le conteneur IoC, utilisez simplement les fichiers JAR appropriés et le bit approprié de l'API, et ignorez le reste.

+0

Ces 'cerises' peuvent être des cerises plutôt lourdes. Une application Spring ME de 664K s'est avérée être une application de 1.9M en passant simplement à Spring. Le noyau de printemps, les haricots et le contexte s'élèvent à 1,2M. C'est fondamentalement aussi petit que possible. –

1

La plupart des réponses semblent concerner la taille des fichiers JAR à ajouter.

Cependant, je pense que la question la plus importante est l'impact sur le projet: Combien de lignes de code doivent être ajoutés/modifiés afin d'utiliser le cadre?

Même le cadre du printemps « grand » est en fait très facile à utiliser:

Vous essentiellement besoin:

  • un fichier xml qui décrit vos usines.
  • une ligne de code pour initialiser le conteneur de chargement du fichier xml

La bonne chose est que le ressort est non intrusive. Vous n'avez donc pas besoin d'implémenter des interfaces spécifiques ou d'ajouter des annotations ou des importations spécifiques à vos classes.

Au mieux le seul endroit où vous initialisez en fait le conteneur Spring est le que lieu dans votre application qui a une dépendance réelle aux classes de printemps.

0

Qu'est-ce qui ne va pas avec Spring?

Ces jours-ci, il est assez bien emballé, donc vous n'avez pas besoin de prendre le kit complet et caboodle. En outre, je ne suis pas fan des frameworks d'injection basés sur les annotations. C'est parce que les annotations sont liées à la classe plutôt qu'à l'instance, la dernière étant un pré-requis, imho, pour DI. Cela signifie que chaque instance d'une classe donnée reçoit le (s) même (s) objet (s) injecté (s), ce qui semble vaincre le point.

Considérez également que DI n'a même pas besoin d'un cadre, quel est le problème avec votre méthode principale de câblage de l'application?

+0

Si vous n'êtes pas un fan de l'injection basée sur l'annotation, alors Spring ME est génial. (Il ne supporte pas cela ;-) Il pourrait cependant, mais ce n'est pas le cas.) –

0

Si vous voulez quelque chose de simple et approprié au maximum, alors écrivez du code qui fait ce que vous voulez faire. Vraisemblablement, cela implique le câblage ensemble des usines basées en partie sur la logique fixe, et en partie sur les paramètres d'exécution. Cela a l'avantage que l'ensemble des configurations d'exécution possibles est connu, et donc documentable et testable. Il a l'inconvénient qu'un déploiement de changement logique imprévu prend intrinsèquement une seconde ou plus de temps de compilation, et (de manière plus significative) ne peut pas être introduit en production sans test complet en le déguisant comme 'juste un changement de configuration '.

1

Je suggère fortement de jeter un oeil à Spring ME. Bien qu'initialement destiné à être un moyen d'utiliser les applications Spring sur Java ME, il fonctionne également très bien pour les applications autonomes.Il est vrai qu'il ne vous offre pas toutes les fonctionnalités que Spring (Full) a à offrir, mais là encore, Full Spring est bien plus qu'un simple framework d'injection de dépendances. Du côté positif: il est basé sur un sous-ensemble (conforme) des fichiers de configuration de Spring, et l'empreinte du runtime est de 0%. En fait, il n'y en a pas. Spring ME va prendre le contexte de votre application, et le transformer en une classe qui n'a pas de dépendances sur des classes autres que la vôtre.

0

Il ya environ un an, je me suis posé une question très semblable à celle-ci. Je passe donc quelques heures à lire la documentation de Spring et Guice. Après environ une heure avec le printemps, j'ai eu l'impression que je pouvais obtenir une application Web de base, mais je n'avais aucune idée de comment l'utiliser dans une application autonome. Après une heure avec le document de Guice, tout avait cliqué et je pouvais voir comment je pouvais faire ce que je voulais faire. Maintenant, à recommander Guice? Et bien non. Qu'est-ce que votre équipe sait déjà? Si quelqu'un sait déjà que le printemps sort de cette connaissance et qu'ils la diffusent. Comme sage avec Guice ou Pico.

+0

Nous sommes tous les deux vides pour le moment, d'où la question sur les expériences: D –

0

Si vous voulez quelque chose de vraiment léger, vous pouvez jeter un oeil à fuse il est assez extensible, peut-être ce que vous cherchez.

acclamations

N

Questions connexes