MyBatis之Mapper与动态代理简介说明

书欣 MyBatis 发布时间:2022-08-15 16:17:24 阅读数:15325 1
下文笔者讲述mybatis的动态代理简介说明,如下所示

动态代理

代理是一种设计模式
一个类A,设计一个拥有同样接口的代理类P
负责为A进行统一的预处理、过滤、事后处理等
例:
interface Base {
    void work1();
    void work2();
}
class A implements Base {
    public void work1() { System.out.println("work1"); }
    public void work2() { System.out.println("work2"); }
}

class P extends A {
    public void work1() {
        long start = new Date().getTime();
        try {
            super.work1();
        } finally {
            long end = new Date().getTime();
            System.out.println(end-start);
        }
    }

    public void work2() {
        .....
    }
}
当我们需为某一个方法扩展功能时,我们只需编写一个代理类,即可扩展其功能
public class MyProxy implements InvocationHandler {  
    private Object target;  

    public Object bind(Object target) {  
        this.target = target;
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),  
                target.getClass().getInterfaces(), this);
    }  

    @Override  
    public Object invoke(Object proxy, Method method, Object[] args)  
            throws Throwable {  
        System.out.println("begin");
        try {
            return method.invoke(target, args);  
        } finally {
            System.out.println("end");
        }
    }  

    public static void main(String[] args) {  
        MyProxy proxy = new MyProxy();  
        Base x = (Base) proxy.bind(new A());  
        x.work1();  
    }  
}  

Mapper与动态代理

 
public class MapperProxy<T> implements InvocationHandler {
    // 生成某个接口的mapper
    public static <T> T newInstance(Class<T> clazz) 
    {
        MapperProxy<T> proxy = new MapperProxy<>();
        // 动态代理
        return (T) Proxy.newProxyInstance(clazz.getClassLoader(), new Class[] { clazz }, proxy);
    }

    // 调用mapper方法时实际执行的内容
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable 
    {
        System.out.println("invoke " + method.getName());
        return null;
    }
}

 
拥有一个newInstance方法
来生成一个指定的mapper
实现了invoke方法
指定在调用mapper方法时执行的事情

public static void main(String args[]) throws Exception {
    ArticleMapper mapper = MapperProxy.newInstance(ArticleMapper.class);
    mapper.findById(888);
} 
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaFramework/MyBatis/202208/4238.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者