在弹簧支架控制器中实例化模型

时间:2017-04-01 09:10:49

标签: java rest spring-mvc autowired

我只需要对我的春季网络应用程序的一部分进行简短的解释,我完全不了解。

我有一个简单的mvc spring网络应用StudentController。对于数据,我有一个实现StudentDataModelStub接口的类IStudentDataModel,它具有一些简单的函数,用于处理存储在ListStudentDataModelStub中的数据。

StudentController课程中我有

@Autowired private IStudentDataModel model;

当我删除@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);

}

1 个答案:

答案 0 :(得分:1)

  

当我删除@Autowired注释时,我得到NullPointerException   是预期的,因为我没有实例化StudentDataModelStub。但是怎么样   spring是否知道要实例化IStudentDataModel的类   with,因为多个类可以实现IStudentDataModel   接口

Spring容器扫描@Componentscan(或xml内的<context:component-scan>)中指定的包内的依赖关系,并将它们注入到bean中。

现在关于要注入哪个实现,你可以从Spring doc找到以下文本(也看here)(强调我的)

  

@Primary 是按类型使用自动装配的有效方法   我可以确定一个主要候选人。当更多   需要控制选择过程,Spring的 @Qualifier   可以使用注释。您可以将限定符值与之关联   具体的参数,缩小类型匹配的集合,使a   为每个参数选择特定的bean。

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

  

为什么模型必须是@Autowired?

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