gpt4 book ai didi

java - 在 Spring 支撑 Controller 中实例化模型

转载 作者:行者123 更新时间:2023-11-30 06:49:05 28 4
gpt4 key购买 nike

我只需要对我的 Spring Web 应用程序的一个我不太理解的部分进行简短的解释。

我有一个带有 StudentController 的简单 mvc spring Web 应用程序。对于数据,我有一个类 StudentDataModelStub ,它实现了 IStudentDataModel 接口(interface),它有一些简单的函数来处理存储在 StudentDataModelStub 中的 List 中的数据 类。

StudentController 类中,我有

@Autowired
私有(private) IStudentDataModel 模型;

当我删除@Autowired注释时,我得到了NullPointerException,这是预期的,因为我没有实例化StudentDataModelStub。但是spring如何知道用哪个类来实例化IStudentDataModel,因为多个类可以实现IStudentDataModel接口(interface),为什么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);

}

最佳答案

When I delete @Autowired annotation I get NullPointerException which is expected, because I don't instantiate StudentDataModelStub. But how does the spring knows which class to instantiate IStudentDataModel with, because multiple classes can implement IStudentDataModel interface?

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

现在关于要注入(inject)哪个实现,您可以从 Spring 文档中找到以下文本(另请参阅 here )(重点是我的)

@Primary is an effective way to use autowiring by type with several instances when one primary candidate can be determined. When more control over the selection process is required, Spring’s @Qualifier annotation can be used. You can associate qualifier values with specific arguments, narrowing the set of type matches so that a specific bean is chosen for each argument.

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

Why model must be @Autowired?

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

关于java - 在 Spring 支撑 Controller 中实例化模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43154911/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com