SpringDataJpa功能扩展
Spring Data Jpa功能虽然已经非常强大,但是它依然存在很多满足不了的需要,在很多时候,我们需要自己去对SpringDataJpa的功能进行相应的扩展(即:自定义Repository)
首先以常规使用SpringDateJpa为例
xml配置
<!--SpringDateJpa配置-->
<jpa:repositories
base-package="wltyx.nyybw.aisell.repository"
transaction-manager-ref="transactionManager"
entity-manager-factory-ref="entityManagerFactory"
/>
可以看出常规的使用方式其实是使用了接口的方式,自定义的EmployeeRepository接口继承了JpaSpecificationExecutor接口和JpaRepository接口就可以实现SpringDateJpa的功能了,但是对于开发者而言仅仅只是写了一个接口,而接口是不可能去完成所需要的功能的,所以在底层一定会有类的创建去实现我们自定义的接口去帮我们实现功能。
@Autowired
private EmployeeRepository dao;
@Test
public void testName(){
System.out.println(dao);
System.out.println(dao.getClass());
}
运行的结果为:
org.springframework.data.jpa.repository.support.SimpleJpaRepository@5c92166b
class com.sun.proxy.$Proxy27
所以所它是使用的代理模式来完成我们所需要的功能
那么我们再看看打印出来的SimpleJpaRepository这个类
可以看出SimpleJpaRepository这个类同样继承了JpaSpecificationExecutor接口和JpaRepository接口
所以说只要我们从这个类入手就可以实现我们自己功能扩展了。
在网上找了很久才知道在SpringDateJpa的xml配置文件约束中有一个factory-class的属性可以指定使用我们自己的工厂去创建代理模式所需要的类
我通过自定义了一个BaseRepositoryImpl类实现了我的Repository公共父接口并继承了SimpleJpaRepository类
之后再创建了一个BaseRepositoryFactoryBean工厂继承JpaRepositoryFactoryBean类
通过自定义的工厂类指向我自定义的BaseRepositoryImpl类
这样便完成了我自定义的对SpringDataJpa功能的扩展,此后只需要在公共父接口BaseRepository中写上所需要的抽象方法,使用BaseRepositoryImpl类去实现方法,便可以在以后所有继承公共父接口BaseRepository的接口中实现所扩展的方法,当然也可以直接写在BaseRepositoryImpl类中,但是并不建议使用这种方式