SpringDataJpa功能扩展结构分析

SpringDataJpa功能扩展

Spring Data Jpa功能虽然已经非常强大,但是它依然存在很多满足不了的需要,在很多时候,我们需要自己去对SpringDataJpa的功能进行相应的扩展(即:自定义Repository)

首先以常规使用SpringDateJpa为例

SpringDataJpa功能扩展结构分析_第1张图片
xml配置

    
    <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这个类

SpringDataJpa功能扩展结构分析_第2张图片
可以看出SimpleJpaRepository这个类同样继承了JpaSpecificationExecutor接口JpaRepository接口

所以说只要我们从这个类入手就可以实现我们自己功能扩展了。

在网上找了很久才知道在SpringDateJpa的xml配置文件约束中有一个factory-class的属性可以指定使用我们自己的工厂去创建代理模式所需要的类

我通过自定义了一个BaseRepositoryImpl类实现了我的Repository公共父接口并继承了SimpleJpaRepository类
SpringDataJpa功能扩展结构分析_第3张图片
之后再创建了一个BaseRepositoryFactoryBean工厂继承JpaRepositoryFactoryBean类
SpringDataJpa功能扩展结构分析_第4张图片通过自定义的工厂类指向我自定义的BaseRepositoryImpl类

这样便完成了我自定义的对SpringDataJpa功能的扩展,此后只需要在公共父接口BaseRepository中写上所需要的抽象方法,使用BaseRepositoryImpl类去实现方法,便可以在以后所有继承公共父接口BaseRepository的接口中实现所扩展的方法,当然也可以直接写在BaseRepositoryImpl类中,但是并不建议使用这种方式

附上源码:SpringDataJpa功能扩展源码

你可能感兴趣的:(SSSDJ框架集成)