2017-04-01 85 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返回它。