没错,spring data jpa很优秀,但有一些东西,我们就想自己来,我除了想用你的,还想用我自己的
首先,我要spring data jpa的接口,为什么,因为很方便啊
public interface TaskDao extends JpaRepository<Task,Long>{
}
然后我想自己定义一些接口,咋办呢,那我就再定义个接口bean吧,然后再定义一些接口方法
public interface TaskDaoCustom<T,ID>{
void method();
}
那这里,我想要spring data jpa的,也想要我自己的,那我就继承吧
public interface TaskDao extends JpaRepository<Task,Long>,TaskDaoCustom<Task,Long>{
}
这时候,你在service应该就可以用method()方法了,但是这时候,method是空的,我们得自己来实现它,那实现吧
public class TaskDaoImpl implements TaskDaoCustom{
@Override
public void method() {
// TODO Auto-generated method stub
System.out.println("who are you !!");
}
}
有心的朋友应该有注意到,为什么我实现TaskDaoCustom的bean不应该是TaskDaoCustomImpl吗?如果你这样子做的话,编译器就报错了
那为什么呢,因为任何继承了Repository(JpaRepository最终也是继承于Repository)spring都会为他生成一个实现类,因为TaskDao 继承于TaskDaoCustom,而TaskDaoCustom中的method不是spring data jpa规范查询方法的规则,如果就报找不到找不到属性了。
或许你会问,TaskDaoCustom不会有TaskDaoCustomImpl的实现类吗,按照spring文档说的,只要配置好实现的后缀名,就会用他来实现方法么,是的,我们是这样子配置后缀的,确实也有Impl。
<jpa:repositories base-package="com.liuxg.**.dao"
repository-impl-postfix="Impl"
query-lookup-strategy = "create-if-not-found"
entity-manager-factory-ref="entityManagerFactory"
transaction-manager-ref="transactionManager" >
</jpa:repositories>
这里要纠正一下,这里的实现spring data jpa规定命名方法是继承于spring data jpa Repository的那个命名 + Impl,例如我们是TaskDao继承于JpaRepository,如果实现类应该是TaskDaoImpl,而不是TaskDaoCustomImpl。
spring data jpa 秉承约定大于实现,只要按照规定和约定来,就能省很多麻烦事。
到这里,你应该就能自己自定义接口了,但这个对于模块是起到了作用,如果我在搭建项目,我想直接,定义 一个BaseDao,然后自定义一些常用的公共方法,然后再利用spring data jpa的优点,只要子模块,继承于BaseDao,就能同时拥有自定义的公用方法和spring data jpa的优点,该怎么做??下一篇再看看??