私のインターフェースがCrudRepositoryを次のように拡張するとします
@Repository
public interface EmployeeRepository extends CrudRepository<Employee, Integer>
{
}
次のように、ServiceクラスでEmployeeRepositoryインターフェイスを使用します
@Service
public class EmployeeService
{
@Autowired
EmployeeRepository employeeRepository;
public List<Employee> getAllEmployee()
{
List<Employee> listEmp=new ArrayList<Employee>();
employeeRepository.findAll().forEach(listEmp::add);
return listEmp;
}
}
そしてコントローラーは次の通り
@RestController
public class WelcomeController
{
@Autowired
EmployeeService empservice;
@RequestMapping("/employees")
public List<Employee> getEmployees()
{
return empservice.getAllEmployee();
}
}
そしてそれは次の例外を与えます
org.springframework.beans.factory.UnsatisfiedDependencyException: 'welcomeController'という名前のBeanの作成エラー:フィールド 'empservice'で表現された満足できない依存関係: 'employeeService'という名前のBean作成エラー:フィールド 'employeeRepository'で表現された満足できない依存関係
インターフェイスEmployeeRepositoryはどのクラスでも実装されていないため、エラーは明らかです。
@Autowired
EmployeeRepository employeeRepository;
クラスがemployeeRepositoryを実装していないため、Autowiredは失敗します。
それでも、GitHubとチュートリアルで見たすべてのコードが完全に機能するので、それがどのように機能するかについて混乱しています。
クラスがそれを実装していない場合でも、どこで問題が発生し、@ AutowiredがCrudRepositoryを拡張するインターフェースでどのように機能しますか。自動配線の基本的なルールはどれですか?つまり、インターフェイスを自動配線する場合、少なくとも1つのクラスがそのインターフェイスを実装する必要があり、その後自動配線が成功します。
まあ、確かに: Spring Data Repositoriesは実際にどのように実装されていますか? で説明されているSpring Data Repositoriesに関する素晴らしい回答があります。ただし、あなたの質問を読んでいるとき、_@Autowired
_の動作に関して少し混乱があると思います。イベントの高レベルのシーケンスを示します。
依存関係をコードのEmployeeRepository
に配置します。
_
@Autowired
private EmployeeRepository employeeRepository;
_
手順(1)を実行することにより、Springコンテナにstartup process中に、EmployeeRepository
を実装するクラスのインスタンスを見つけて、それを_@Autowired
_アノテーション。ここでstress注入が適切に機能するために、クラスのインスタンスが必要です必要なインターフェイスの実装の間にSpringコンテナに- コンパイルプロセス中ではなく実行時。
したがって、論理的な質問が出てきます:「UserRepository
を実装するクラスのどこから、そのクラスを明示的に定義していない場合、起動プロセス中にSpringコンテナに表示されますか?」
それはOliverからの詳細な回答でした: Spring Dataリポジトリは実際にどのように実装されていますか? 簡単に言うと、コンテナbootstrapプロセス中にSpring Dataがすべてのリポジトリインターフェイスをスキャンするということです。これらのインターフェースを実装する新しいクラス(プロキシ)を作成します。これらのクラスのインスタンスをSpringコンテナーに入れます。これにより、コンテナー内の他のSpring Beanの場合と同様に、_@Autowired
_がそれらを見つけて注入できるようになります。
また、これらのプロセスは、Spring Dataがセットアップされ、正しく構成されている場合にのみ機能します。そうでない場合、実際にインジェクションは失敗します。
お役に立てれば。