2017-04-01 80 views
0

我只需要對我的彈簧web應用的一部分進行簡短的解釋,但我並不完全明白。在彈簧休息控制器中的實例化模型

我有一個簡單的mvc彈簧web應用程序StudentController。對於數據我有一個類StudentDataModelStub,實現IStudentDataModel接口女巫有一些簡單的功能,用於存儲ListStudentDataModelStub類中的數據。

StudentController類我有

@Autowired private IStudentDataModel model;

當我刪除@Autowired註釋我得到NullPointerException預計,因爲我不實例StudentDataModelStub。但是彈簧如何知道哪個類實例化了IStudentDataModel,因爲多個類可以實現接口IStudentDataModel,並且爲什麼model必須是@Autowired

這是StudentDataModelStub類的一部分。

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

你可以添加'StudentDataModelStub'的代碼嗎? – developer

回答

1

當我刪除@Autowired註解,我得到的NullPointerException這 預期,因爲我不實例StudentDataModelStub。但是彈簧如何知道哪個類實例化了IStudentDataModel ,因爲多個類可以實現IStudentDataModel接口?

Spring容器掃描@Componentscan(或<context:component-scan>在xml中)指定的包內的依賴關係,並將它們注入到bean中。

現在關於注入哪個實現,你可以找到從春季DOC(也期待here)(重點煤礦)

@Primary是類型與使用自動裝配的有效途徑下方的文本幾個當一個主要候選人可以確定。當需要更多控制選擇過程時,可以使用Spring的註釋。您可以將限定符值與 特定參數相關聯,從而縮小一組類型匹配,以便爲每個參數選擇一個特定的bean。

總之,如果多個實現爲同一interface定義,那麼就需要知道哪個豆通過指定@Primary@Qualifier被注入容器中。

爲什麼模型必須是@Autowired?

您的StudentDataModelStub類實際上並不是Model(實體)類,它實際上是緩存學生的數據並根據id返回它。