3 回答
TA贡献1827条经验 获得超7个赞
对于初学者,我建议不要使用字段注入,而是使用构造函数注入。我还建议使用特定类型,与泛型一样,更改是删除了类型信息。
我可能会做类似的事情
public abstract class Extractor<T,KEY> {
private final CrudRepository<T,KEY> repository;
protected Extractor(CrudRepository<T, KEY> repository) {
this.repository=repository;
}
}
然后在您的特定类中使用AccountRepository并将其传递给超类。
@Component
class AccountExtractor extends Extractor<Account, Long>{
AccountExtractor(AccountRepository repository) {
super(repository);
}
}
这样在你的超类和方法中你仍然可以使用基类型CrudRepository。额外的优势还在于,您现在可以非常轻松地为 编写单元测试AcountExtractor并简单地模拟 ,AccountRepository而无需引导 Spring Boot 应用程序。(我知道你可以使用,@DataJpaTest但简单的模拟更快)。
TA贡献1818条经验 获得超3个赞
只需使用抽象方法并在子类中执行接线
public abstract CrudRepository<T,KEY> getRepository();
...
FooRepository implements CrudRepository<Foo,Integer>
...
@Autowired
protected FooRepository repository;
@Override
public CrudRepository<Foo,Integer> getRepository() {
return repository;
}
TA贡献1909条经验 获得超7个赞
我会说AccountRepository缺少“魔法注释”:
@Repository // This tells Spring Data to actually create a "standard" repository instance for us
public interface AccountRepository extends CrudRepository<Account, Long>{}
添加回答
举报