web-dev-qa-db-ja.com

CrudRepositoryを拡張する@Autowiredインターフェースはどのように機能しますか?いくつかの洞察を得たい

私のインターフェースが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つのクラスがそのインターフェイスを実装する必要があり、その後自動配線が成功します。

10
Pawan Patil

まあ、確かに: Spring Data Repositoriesは実際にどのように実装されていますか? で説明されているSpring Data Repositoriesに関する素晴らしい回答があります。ただし、あなたの質問を読んでいるとき、_@Autowired_の動作に関して少し混乱があると思います。イベントの高レベルのシーケンスを示します。

  1. 依存関係をコードのEmployeeRepositoryに配置します。

    _
    @Autowired 
    private EmployeeRepository employeeRepository;
    _
  2. 手順(1)を実行することにより、Springコンテナにstartup process中に、EmployeeRepositoryを実装するクラスのインスタンスを見つけて、それを_@Autowired_アノテーション。ここでstress注入が適切に機能するために、クラスのインスタンスが必要です必要なインターフェイスの実装の間にSpringコンテナに- コンパイルプロセス中ではなく実行時

  3. したがって、論理的な質問が出てきます:「UserRepositoryを実装するクラスのどこから、そのクラスを明示的に定義していない場合、起動プロセス中にSpringコンテナに表示されますか?」

  4. それはOliverからの詳細な回答でした: Spring Dataリポジトリは実際にどのように実装されていますか? 簡単に言うと、コンテナbootstrapプロセス中にSpring Dataがすべてのリポジトリインターフェイスをスキャンするということです。これらのインターフェースを実装する新しいクラス(プロキシ)を作成します。これらのクラスのインスタンスをSpringコンテナーに入れます。これにより、コンテナー内の他のSpring Beanの場合と同様に、_@Autowired_がそれらを見つけて注入できるようになります。

また、これらのプロセスは、Spring Dataがセットアップされ、正しく構成されている場合にのみ機能します。そうでない場合、実際にインジェクションは失敗します。

お役に立てれば。

15
Ruben