2014-03-19 70 views
0

的抽象類中的注入讓我想象每個實體都有一個用於數據庫訪問和服務類的存儲庫類(spring data jpa)。依賴關係由spring框架管理。每個服務方法確實在大多數情況下是相同的,所以主要存在重複代碼:@基於子類

public class NewsService { 
    @Inject 
    private NewsRepository newsRepository; 

    public void add(News news) { 
     // do some validation 
     newsRepository.save(news); 
    } 
} 

public class UserService { 
    @Inject 
    private UserRepository userRepository; 

    public void add(User user) { 
     // do some validation 
     userRepository.save(user); 
    } 
} 

現在我想到了創建一個抽象類,像這樣:

public abstract class AbstractService<T> { 
    private UnknownRepository unknownRepository; 

    public void add(T entity) { 
     // do some validation 
     unknownRepository.save(entity); 
    } 
} 

public class NewsService extends AbstractService<News> { 

} 

public class UserService extends AbstractService<User> { 

} 

我的問題:我怎麼能覆蓋基於我的實體的抽象類中使用的存儲庫?

回答

2

你可以用一個抽象方法和類型參數替換UnknownRepository領域:

// R is the type of the repository 
public abstract class AbstractService<T,R extends BaseRepository> { 
    protected abstract R getRepository(); 

    public void add(T entity) { 
     getRepository().save(entity); 
    } 
} 

並注入特定庫到這個類的實現:

public class NewsService extends AbstractService<News, NewsRepository> { 
    @Inject private NewsRepository newsRepository; 

    @Override 
    public NewsRepository getRepository() { 
     return newsRepository; 
    } 

    // the inherited add() method works now 
}