2013-01-10 2 views
8

어떤 클래스 Bar의 모든 스프링 데이터 저장소의 목록을 감안할 때?주어진 도메인 클래스에 대한 스프링 데이터 저장소 인스턴스를 검색하는 방법은 무엇입니까?</p> <pre><code>@Autowired private List<Repository> repositories; </code></pre> <p>가 어떻게 위의 목록에서 기존 도메인 클래스 <code>Foo</code>의 저장소를 찾을 수 있습니다

다음이 존재한다고 가정 :

@Entity 
public class Foo { 
    ... 
} 

public interface FooRepository extends JpaRepository<Foo, String> {} 

답변

2

솔루션의 핵심입니다 봄의 방법 getDomainType()을 제공 org.springframework.data.repository.core.support.DefaultRepositoryMetadata.

DefaultRepositoryMetadata에는 생성자 arg로 저장소 인터페이스가 필요합니다. 따라서 기존의 모든 저장소를 반복 할 수 있고 저장소 인터페이스를 검색 할 수 있습니다. 저장소 인터페이스는 두 개 이상의 인터페이스가 있기 때문에 여전히 까다로운 부분이며 getDomainType()Foo.class 인 것을 찾습니다.

18

스프링 데이터 공유에는 ListableBeanFactory이 정의되어있는 모든 저장소 빈을 찾기 위해 클래스 Repositories이 포함되어 있으며 도메인 클래스 (….getRepository(Class<?> type) 통해)를 통해 이러한 인스턴스를 얻기 위해 API를 제공합니다.

이 클래스는주의해서 사용해야합니다. 저장소 인스턴스에 대해 심각한 프록시 생성이 진행되므로 ApplicationContext 생성 중에 Repositories 인스턴스가 가능한 한 늦게 생성되었는지 확인해야합니다. 선호하는 방법은 ApplicationListener을 구현하고 ContextRefreshedEvent을 청취하여 인스턴스를 만드는 것입니다. 경우 웹 응용 프로그램을 작성하는

, Repositories를 사용하는 가장 안전한 방법은 ContextLoaderListener에 의해 생성 된 ApplicationContext의 저장소를 부트 스트랩 및 자세한 내용은 스프링 MVC의 reference documentation를 참조합니다 (Repositories을 배치하는 것입니다.

+6

웹 응용 프로그램에 대한 코드 샘플이 있습니까? –

7
@Service 
public class GenericRepository { 

    @Autowired 
    private WebApplicationContext appContext; 

    Repositories repositories = null; 

    public GenericRepository() { 
     repositories = new Repositories(appContext); 
    } 

    public JpaRepository getRepository(AbstractPersistable entity) { 
     return (JpaRepository) repositories.getRepositoryFor(entity.getClass()); 
    } 

    public Object save(AbstractPersistable entity) { 
     return getRepository(entity).save(entity); 
    } 

    public Object findAll(AbstractPersistable entity) { 
     return getRepository(entity).findAll(); 
    } 

    public void delete(AbstractPersistable entity) { 
     getRepository(entity).delete(entity); 
    } 
}