2017-04-01 4 views
0

Ich brauche nur kurze Erklärung eines Teils meiner Spring Web App, die ich nicht genau verstehe.Instantiierung Modell im Frühjahr Ruhe Controller

Ich habe eine einfache MVC Spring Web App mit StudentController. Für Daten habe ich eine Klasse StudentDataModelStub, die IStudentDataModel Schnittstelle implementiert, die einige einfache Funktionen für die Arbeit mit Daten hat, die in der List in StudentDataModelStub Klasse gespeichert sind.

In StudentController Klasse Ich habe

@Autowired private IStudentDataModel model;

Wenn ich @Autowired Anmerkung lösche ich NullPointerException erhalten, die zu erwarten ist, weil ich StudentDataModelStub nicht instanziiert. Aber wie weiß der Frühling, welche Klasse zu instanziieren IStudentDataModel mit, weil mehrere Klassen IStudentDataModel Schnittstelle implementieren können, und warum model muss @Autowired sein?

Dies ist ein Teil der StudentDataModelStub Klasse.

public class StudentDataModelStub implements IStudentDataModel { 

private final Map<Integer, Student> data = new HashMap<>(); 

@Override 
public List<Student> getStudents() { 
    // TODO Auto-generated method stub 
    return new ArrayList<>(data.values()); 
} 

@Override 
public Student getStudent(int id) throws IdNotFoundException { 
    // TODO Auto-generated method stub 
    if(!data.containsKey(id)){ 
     throw new IdNotFoundException("..."); 
    } 

    return data.get(id); 

} 
+0

Können Sie den Code für 'StudentDataModelStub' hinzufügen? – developer

Antwort

1

Wenn ich @Autowired Anmerkung lösche ich bekommen Nullpointer die zu erwarten ist, weil ich nicht StudentDataModelStub instanziiert. Aber wie weiß der Frühling, welche Klasse IStudentDataModel mit instanziieren, weil mehrere Klassen IStudentDataModel Schnittstelle implementieren können?

Feder Container-Scans für die Abhängigkeiten innerhalb von Paketen in @Componentscan angegeben (oder <context:component-scan> innerhalb xml) und spritzt sie in die Bohnen.

nun in Bezug auf die Umsetzung zu injizieren, können Sie den Text unten aus Spring doc finden (auch here sehen) (Hervorhebung von mir)

@Primaryist ein effektiver Weg autowiring nach Typ zu verwenden, mit mehrere i nstanzen, wenn ein primärer Kandidat bestimmt werden kann. Wenn mehr Kontrolle über den Auswahlprozess erforderlich ist, kann Spring @Qualifier Annotation verwendet werden. Sie können Qualifier-Werte mit spezifischen Argumenten verknüpfen, indem Sie die Menge der Typübereinstimmungen so eingrenzen, dass für jedes Argument eine spezifische Bean ausgewählt wird.

Kurz gesagt, wenn mehrere Implementierungen für die gleiche interface definiert, dann müssen Sie den Behälter sagen, welche Bohne von @Primary oder @Qualifier Angabe injiziert werden.

Warum muss das Modell @Autowired sein?

Ihre StudentDataModelStub Klasse ist nicht wirklich ein Modell (Entity) Klasse, ist es tatsächlich die Daten des Schülers-Caching und es auf der Basis der id zurück.

Verwandte Themen