启动项目失败,查看了一下是注解扫描范围和泛型依赖注入的问题,遂记录一下。
失败的原因代码部分:
public class AService extends BaseService<BEntity>{
}
这里A类服务继承了B类实体的基础服务类。但是没有加上@Service,导致没有被扫描并放入Spring容器中进行管理,所以导致Controller层在进行@Autowire自动装配时失败了。
加上注解之后,发现仍然存在问题。这次是因为BEntity没有实现对应的Dao层。
一开始这里还以为要写成这样才可以:
@Service
public class AService extends BaseService<AEntity>{
}
以为必须要前缀名对齐才行,但其实不是。这两种写法都可以,但必须确认对应的持久层存不存在,若不存在,则会报错。因为Mybatis会根据泛型依赖注入,去寻找对应的Repository文件。
public interface ARepository extends Mapper<AEntity> {
}
但为什么要遵循这个规则?
关键就在于“extends BaseService<AEntity>"的后半部分:BaseService<AEntity>。
泛型类BaseService<T> 有个成员变量,类型为Mapper<T>(也可以用BaseRepository<T>实现) , 任何实现了Mapper<T>的子类,例如ARepository extends Mapper<A> 指定了泛型类型,即子类BaseReposiotry可以放入Spring容器,然后注入给BaseRepository类型的变量。所以这一部分的实现是不可或缺的。