Java spring-rest控制器中的实例化模型

Java spring-rest控制器中的实例化模型,java,rest,spring-mvc,autowired,Java,Rest,Spring Mvc,Autowired,我只需要对我的SpringWeb应用程序的一个部分进行简短的解释,但我并不完全理解 我有一个简单的mvc spring web应用程序,带有StudentController。对于数据,我有一个类StudentDataModelStub,它实现了IStudentDataModel接口,该接口具有一些简单的函数,用于处理StudentDataModelStub类中列表中存储的数据 public class StudentDataModelStub implements IStudentDataMo

我只需要对我的SpringWeb应用程序的一个部分进行简短的解释,但我并不完全理解

我有一个简单的mvc spring web应用程序,带有
StudentController
。对于数据,我有一个类
StudentDataModelStub
,它实现了
IStudentDataModel
接口,该接口具有一些简单的函数,用于处理
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);

}
StudentController
课堂上,我有

@Autowired
私有IStudentDataModel模型

当我删除
@Autowired
注释时,我会得到预期的
NullPointerException
,因为我没有实例化
StudentDataModelStub
。但是spring如何知道实例化哪个类是
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);

}
公共类StudentDataModelStub实现IStudentDataModel{
私有最终映射数据=新HashMap();
@凌驾
公众学生名单{
//TODO自动生成的方法存根
返回新的ArrayList(data.values());
}
@凌驾
公共学生getStudent(int id)抛出IdNotFoundException{
//TODO自动生成的方法存根
如果(!data.containsKey(id)){
抛出新的IdNotFoundException(“…”);
}
返回data.get(id);
}
当我删除@Autowired annotation时,我会得到NullPointerException,它 是预期的,因为我没有实例化StudentDataModelStub spring是否知道要实例化哪个类IStudentDataModel 使用,因为多个类可以实现IStudentDataModel 接口

Spring容器扫描
@Componentscan
(或
内部xml)中指定的包中的依赖项,并将它们注入bean中

现在,关于注入哪个实现,您可以从SpringDoc中找到以下文本(也可以查看)(我的重点)

@Primary是按类型使用自动布线的有效方法,其中包含多个 i可以确定一个主要候选人时的情况 需要控制选择过程,Spring的限定符 可以使用批注。您可以将限定符值与 特定参数,缩小类型匹配集,以便 为每个参数选择特定的bean

简而言之,如果为同一
接口定义了多个实现,那么您需要通过指定
@Primary
@Qualifier
来告诉容器要注入哪个bean

为什么模型必须@Autowired


您的
StudentDataModelStub
类实际上不是一个模型(实体)类,它实际上是在缓存学生的数据并根据id返回数据。

您可以为
StudentDataModelStub
添加代码吗?