我只需要对我的春季网络应用程序的一部分进行简短的解释,我完全不了解。
我有一个简单的mvc spring网络应用StudentController
。对于数据,我有一个实现StudentDataModelStub
接口的类IStudentDataModel
,它具有一些简单的函数,用于处理存储在List
类StudentDataModelStub
中的数据。
在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);
}
答案 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返回。