在我的网络应用程序中,我有两种不同的数据存储 - 数据库和文件。在 application.properties
中,我可以设置我想使用哪一个。我使用 Spring Data JPA 来从数据库访问对象,因此我的 DataBaseRepository 扩展了 CrudRepository。
我想在Service
层注入(inject)Repository的一个接口(interface),并且
实现将取决于所选的配置文件(在 application.properties 中)。
问题是我的 FileRepository
没有实现 CrudRepository
,所以我的存储库没有用于注入(inject)的通用接口(interface)。
方法 1:假设我的 FileRepository
扩展了 CrudRepository
(并且我用 @NoRepositoryBean
标记 FileRepository)
问题:我的FileRepository
实现必须实现许多我不需要的方法(我不知道这是否是正常方法并且有效)
方法2:不要使用CrudRepository
接口(interface)
问题:编写许多样板代码
所以,请告诉我另一种方法,如果它们存在于这种情况下,或者说哪种方法更好。如有任何帮助,我们将不胜感激。
最佳答案
您可以创建一个扩展 CrudRepository 的 CustomCrudRepository 和一个 BaseRepository。BaseRepository 接口(interface)包含任何实现都必须支持的每个方法。最有可能从 CrudRepository 复制签名。比基于BaseRepository的注入(inject)。
很难解释,所以请看下面没有泛型的示例。您可以自行添加它们。
public interface BaseRepo {
// common methods
long count();
...
}
@NoRepositoryBean
interface CustomCrudRepository extends CrudRepository, BaseRepo {
}
interface EntityRepository extends CustomCrudRepository {
}
class FileRepository implements BaseRepo {
@Override
public long count() {
return 0;
}
}
@Service
class SomeService {
@Autowired
private BaseRepo repo;
}
关于java - 在Spring的Service层注入(inject)一个数据存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40164299/