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. p>
un haricot.xml et une classe de méthode principale. p>
interface iwriter.java p> écrivain de classe.java p> classe nicewriter.java < / p> une autre classe p> main.java p> haricot .xml p> 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 ?? p> p>
5 Réponses :
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>" )
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>
Changez votre code comme suit.
écrivain de classe.java p> classe nicewriter.java p> Une autre classe p>
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.
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);
}
}
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 p>
J'aimerais afficher une option de plus à l'aide de Avantages: p> exemple de code basé sur @ conditionnelProperty attribut p> et p> quand au lieu de @ conditionnelProperty Il existe d'autres options telles que conditionnel , @ conditionnel Expression . P> p> Application.Properties Code>.
demande .properties code> contient écrivain.type = Nice code> NiceWriter sera instancié pour iWriter Interface. P>
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.
Avant de poster la question, le code devrait être bien formaté