2017-04-01 4 views
0

私は春のWebアプリケーションの一部について、私が正確に理解していない短い説明が必要です。春休みコントローラでモデルをインスタンシエート

私はStudentControllerの単純なmvcスプリングウェブアプリを持っています。データの場合、StudentDataModelStubIStudentDataModelインターフェースウィッチを実装しており、のStudentDataModelStubクラスに格納されたデータを扱うための単純な関数をいくつか持っています。 StudentControllerクラスで

私はStudentDataModelStubをインスタンス化していないため、期待されている私はNullPointerExceptionを得る@Autowired注釈を削除すると、私は

@Autowired private IStudentDataModel model;

を持っています。しかし、どのクラスが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注釈を削除すると、私はStudentDataModelStubをインスタンス化していないので、私は、 が予想されるNullPointerExceptionが得られます。しかし、どのように は、IStudentDataModel インターフェイスを複数のクラスで実装できるので、IStudentDataModel をインスタンス化するクラスを知っていますか?

(XML内または<context:component-scan>@Componentscanに指定されたパッケージ内の依存関係のためにSpringコンテナスキャンと豆にそれらを注入します。

さて、あなたは春のドキュメント(もhereを見て)(強調鉱山)

@Primaryがでタイプ別にオートワイヤリングを使用するための効果的な方法であるから、以下のテキストを検索することができます注入するどの実装について1つの主要な候補が決定できるときの状況 。 の選択プロセスの制御が必要な場合は、Springの@Qualifier 注釈を使用できます。修飾子の値を の特定の引数に関連付けることができます。これにより、型一致のセットが絞り込まれ、 特定のBeanが各引数に選択されます。要するに

複数の実装が同じinterfaceのために定義されている場合は、Beanが@Primaryまたは@Qualifierを指定することにより、注入されるコンテナを指示する必要があります。

なぜモデルは@Autowiredである必要がありますか?

StudentDataModelStubクラスは実際にはModel(Entity)クラスではなく、実際に生徒のデータをキャッシュしてIDに基づいて返します。

関連する問題