自定义注解+动态代理 模拟 Spring data jpa 的实现原理

今天使用动态代理来模拟 Spring data jpa 的实现原理,从而让学习者更加理解动态代理;

好了,话不多说,直接看代码

 

自定义注解

package com.yonyou.learn.porxy;

import java.lang.annotation.*;

/**
 * 自定义注解
 */

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Documented
public @interface DIYQuery {
    String value() default "";
}

创建dao层

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);
}

 

构建代理类的实现逻辑(伪代码)

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;
    }
}

 

构建代理类

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);

    }

}

 

测试调用

package com.yonyou.learn.porxy;

public class TestProxy {
    public static void main(String[] args) {
        DIYDao dao= (DIYDao) DIYPorxy.getInstance(DIYDao.class);

        dao.queryAll("table");
    }
}

 

测试结果查看

select count(*) from table where param=table
Process finished with exit code 0

 

你可能感兴趣的:(自定义注解+动态代理 模拟 Spring data jpa 的实现原理)