11
votes

Le printemps cueille-t-il une mise en œuvre de l'interface de nombreux, seuls?

Les amis ci-dessous sont mon code, j'essaie d'exécuter une injection de dépendance avec le printemps

J'ai une interface, deux implémentations de catégorie de cette interface.

un haricot.xml et une classe de méthode principale.

interface iwriter.java xxx

écrivain de classe.java xxx

classe nicewriter.java < / p> xxx

une autre classe xxx

main.java xxx

haricot .xml xxx

Lorsque je exécute le code, le conteneur à ressort donne la sortie de la méthode de la classe écrivaine.java. Je n'ai nulle part spécifié quelle implémentation choisie. Comment le printemps ramasse-t-il la mise en œuvre de l'écrivain.java ??


1 commentaires

Avant de poster la question, le code devrait être bien formaté


5 Réponses :


10
votes

Lorsqu'il y a plus d'une implémentation de l'interface et que vous utilisez @Autowired dans ce cas, sortez le ressort de la classe. Mais si vous souhaitez une implémentation spécifique audiofire, vous pouvez utiliser

@Qualifier( "<implementing class name>" ) 
  • Tous les haricots de printemps sont gérés - ils "vivent" à l'intérieur d'un conteneur, appelé "contexte d'application". Li>
  • Chaque application a un point d'entrée dans ce contexte. En outre, il existe un lieu où le contexte de l'application est bootstrapped et tous les haricots - autonomes. Dans les applications Web, cela peut être un auditeur de démarrage. LI> ul>

    La mise en forme d'automne se produit en plaçant une instance d'un haricot dans le champ souhaité dans une instance d'un autre haricot. Les deux classes doivent être des haricots, c'est-à-dire qu'ils devraient être définis pour vivre dans le contexte de l'application. P> P>


0 commentaires

10
votes

Changez votre code comme suit.

écrivain de classe.java xxx

classe nicewriter.java xxx

Une autre classe xxx


2 commentaires

Code de format avant de soumettre pour une meilleure lisibilité et une meilleure compréhension


Je garderai à l'esprit le formatage du code. Quoi qu'il en soit, merci pour la réponse.



1
votes

Essayez celui-ci.

     package DI;

      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.beans.factory.annotation.Qualifier;
      import org.springframework.stereotype.Service;

      @Service
      public class MySpringBeanWithDependency {

     @Autowired
     private IWriter writer;

     @Autowired
    private IWriter niceWriter


       public void run() {
       String s = "This is my test";
        writer.writer(s);
      }
    }


0 commentaires

0
votes

Cela dépend du cas d'utilisation, vous pouvez sélectionner la mise en oeuvre de l'interface à l'aide de profils de ressort, d'annotations personnalisées ou mentionnées par d'autres réponses à l'aide de @qualifier (injection par nom) équivalente à JSR-330's's Annotation


0 commentaires

1
votes

J'aimerais afficher une option de plus à l'aide de Application.Properties .

Avantages:

  • Vous n'avez pas besoin de changer de code lorsque vous ajoutez / modifier la mise en œuvre de l'interface
  • fonctionne bien avec des tests unitaires et d'autres environnements

    exemple de code basé sur @ conditionnelProperty attribut xxx

    et xxx

    quand demande .properties contient écrivain.type = Nice NiceWriter sera instancié pour iWriter Interface.

    au lieu de @ conditionnelProperty Il existe d'autres options telles que conditionnel , @ conditionnel Expression .


1 commentaires

Merci pour cette réponse! J'ai besoin de contrôle sur la mise en œuvre utilisée en fonction de différents environnements (par exemple, des aspects d'application des applications dans les environnements de test / de non-production) + extensibilité. Pour ce cas d'utilisation, je pense que cette approche conviendra le plus. Je vais le tester tout de suite.