您的位置:首页 > 编程语言 > Java开发

自定义注解+动态代理 模拟 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

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: