org.springframework.data.jpa.repository.JpaRepository 인터페이스를 구현하는 클래스는 무엇입니까?

샘플 애플리케이션 (Spring Data JPA 버전)을 보면 저장소에 두 개의 인터페이스 만 만들어졌습니다.



인터페이스를 제작하는 클래스는 보이지 않습니다. 실제로 info.saladlam.example.spring.noticeboard.service.MessageServiceImpl에 주입하는 인스턴스 클래스는 무엇입니까?

MessageServiceImpl에 주입하는 인스턴스는 프록시이며, 그 타겟 인스턴스 클래스는 org.springframework.data.jpa.repository.support.SimpleJpaRepository이다. 다양한 인터셉터가 이 프록시에 붙이고 그 안에 중요한 인터셉터는 org.springframework.data.repository.core.support.RepositoryFactorySupport.QueryExecutorMethodInterceptor이다.

아래는 인터페이스 info.saladlam.example.spring.noticeboard.repository.MessageRepository
public interface MessageRepository extends JpaRepository<Message, Long> {

    @Query("SELECT m FROM Message m WHERE m.approvedBy IS NOT NULL AND m.publishDate <= :at AND (m.removeDate IS NULL OR m.removeDate > :at) ORDER BY m.publishDate DESC")
    List<Message> findPublished(@Param("at") LocalDateTime at);

    @Query("SELECT m FROM Message m WHERE m.approvedBy IS NULL ORDER BY m.publishDate DESC")
    List<Message> findWaitingApprove();

    @Query("SELECT m FROM Message m WHERE m.owner = :owner ORDER BY m.publishDate DESC")
    List<Message> findByOwner(@Param("owner") String owner);

}

그리고 부모 인터페이스 org.springframework.data.jpa.repository.JpaRepository
@NoRepositoryBean
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {

    List<T> findAll();
    List<T> findAll(Sort sort);
    List<T> findAllById(Iterable<ID> ids);
    <S extends T> List<S> saveAll(Iterable<S> entities);
    void flush();
    <S extends T> S saveAndFlush(S entity);
    void deleteInBatch(Iterable<T> entities);
    void deleteAllInBatch();
    T getOne(ID id);

    @Override
    <S extends T> List<S> findAll(Example<S> example);

    @Override
    <S extends T> List<S> findAll(Example<S> example, Sort sort);

}

예를 들어, JpaRepository에서 정의하는 findAll() 메소드가 호출될 때, 실제로 SimpleJpaRepository의 findAll() 메소드가 호출된다. MessageRepository로 정의하는 findWaitingApprove() 메소드가 불려 갈 때, 인터셉터 org.springframework.data.repository.core.support.RepositoryFactorySupport.QueryExecutorMethodInterceptor가 작동시킨다. 아래는 org.springframework.data.repository.core.support.RepositoryFactorySupport.QueryExecutorMethodInterceptor.doInvoke() 메서드
        @Nullable
        private Object doInvoke(MethodInvocation invocation) throws Throwable {

            Method method = invocation.getMethod();
            Object[] arguments = invocation.getArguments();

            if (hasQueryFor(method)) {
                return queries.get(method).execute(arguments);
            }

            return invocation.proceed();
        }

queries는 맵이며 org.springframework.data.jpa.repository.query.JpaQueryMethod 인스턴스를 저장하고 키는 MessageRepository에서 정의하는 메소드입니다.

좋은 웹페이지 즐겨찾기