2009-02-16 10 views
4

J'ai utilisé le printemps avant (et comme ça), mais j'ai pensé jeter un oeil à Guice.Can Guice peut-il initialiser les haricots?

Existe-t-il un moyen d'initialiser quelque chose comme des cartes ou des listes dans les beans en utilisant Guice? Par exemple, j'ai déjà fait ce qui suit au printemps pour injecter une liste d'éléments que je veux traiter dans un bean.

<property name="FilesToProcess"> 
    <list> 
     <value>file1.xml</value> 
     <value>file2.xml</value> 
    </list> 
</property> 

Comment puis-je faire cela dans Guice?

Répondre

6

Guice2 possède MultiBindings et MapBindings, qui devraient fonctionner pour vous.

https://github.com/google/guice/wiki/Multibindings

Mise à jour:

Après avoir regardé cette fois, il semble que vous demandez peut-être comment vous pouvez injecter des valeurs d'exécution dans Guice, peut-être des objets comme arbitraires.

Guice est très concentré sur le fait de tout faire en tant que code de type sécurisé, donc il ne se prête pas naturellement à cela. Ce que j'ai fait pour fournir une entrée à Guice est de créer un schéma XML et d'utiliser jaxb pour aspirer et injecter les objets résultants.

Il existe une méthode Names.bindProperties pour lier les anciennes propriétés régulières aux constantes Guice .

Il y a également un certain niveau d'intégration avec Spring, donc vous voudrez peut-être regarder cela comme .

+0

Merci! Votre mise à jour a répondu exactement à ma question. – Vinnie

+0

ce lien est mort, quelqu'un peut-il fournir un nouveau lien vers les informations pertinentes que ce lien contient? –

2

Guice vous permet d'injecter des littéraux de type. La syntaxe est un peu étrange. Il y a un blog entry qui explique pourquoi.

La liaison ressemblerait à quelque chose comme ceci:

public class SampleModule extends AbstractModule { 
    protected void configure() { 
     bind(new TypeLiteral<List<String>>() {}). 
       annotatedWith(Names.named("FilesToProcess")). 
       toInstance(Arrays.asList("file1.xml", "file2.xml")); 
    } 
} 

Et puis votre code d'application pourrait injecter la liste par nom comme celui-ci:

public class SampleClass { 
    private final List<String> files; 

    @Inject 
    public SampleClass(@Named("FilesToProcess") List<String> files) { 
     this.files = files; 
    } 
} 
1

Je suis d'accord avec Dave Stenglein pour les valeurs d'exécution.

Il existe des structures comme Obix qui sont spécialisées dans la configuration. J'aime Guice pour injection de code, mais ils sont meilleurs pour cette injection de configuration.