自定义注解+动态代理 模拟 Spring data jpa 的实现原理
2020-05-24 12:40
796 查看
今天使用动态代理来模拟 Spring data jpa 的实现原理,从而让学习者更加理解动态代理;
好了,话不多说,直接看代码
自定义注解
[code]package com.yonyou.learn.porxy; import java.lang.annotation.*; /** * 自定义注解 */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) @Documented public @interface DIYQuery { String value() default ""; }
创建dao层
[code]package com.yonyou.learn.porxy; /** * 自定义dao * 使用java动态代替 模拟spring data jpa 实现 */ public interface DIYDao { @DIYQuery(value = "select count(*) from table where param=?") public int queryAll(String param); }
构建代理类的实现逻辑(伪代码)
[code]package com.yonyou.learn.porxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class DIYInvocationHandler implements InvocationHandler { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //获取注解 DIYQuery diyQuery= method.getAnnotation(DIYQuery.class); //获取sql String sql=diyQuery.value(); //将sql的占位符修改为参数 sql=sql.replaceAll("\\?",(String)args[0]); System.out.printf(sql); //执行sql; //TODO return 1; } }
构建代理类
[code]package com.yonyou.learn.porxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; /** * 构建动态代理,实现jpa查询 */ public class DIYPorxy { public static Object getInstance(Class clazz){ //类加载器 ClassLoader classLoader=DIYPorxy.class.getClassLoader(); //动态构造的对象需要实现的接口 Class[] cla=new Class[]{clazz}; //动态构造对象的调用方法(实现逻辑) InvocationHandler diyInvocationHandler=new DIYInvocationHandler(); return Proxy.newProxyInstance(classLoader,cla,diyInvocationHandler); } }
测试调用
[code]package com.yonyou.learn.porxy; public class TestProxy { public static void main(String[] args) { DIYDao dao= (DIYDao) DIYPorxy.getInstance(DIYDao.class); dao.queryAll("table"); } }
测试结果查看
[code]select count(*) from table where param=table Process finished with exit code 0
相关文章推荐
- 反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)
- 反射实现AOP 动态代理模式(Spring AOP 的实现原理)
- Spring Data JPA: 实现自定义Repository
- 反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)
- Spring AOP 的实现原理----动态代理
- spring data实现自定义的repository实现类,实现跟jpa联通
- SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法
- 反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)
- 反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。
- IBatis Mapper&Spring Data JPA实现原理
- 反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)
- 反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)
- [转贴] 反射实现 AOP 动态代理模式(Spring AOP 的实现原理)
- Spring AOP动态代理原理与实现方式
- 反射实现 AOP 动态代理模式(Spring AOP 的实现原理)
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务
- 反射实现 AOP 动态代理模式(Spring AOP实现原理)
- 反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)
- 1007--反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)