MyBatis【转】MyBatis接口的简要实现原理

MyBatis接口的大概实现原理

用过MyBatis3的人想必会认为怎么MyBatis的Mapper接口没有兑现类,但是可以直接用?

那是因为MyBatis使用Java动态代理实现的接口。

此间仅仅举个简易例子来证实原理,不是一心针对MyBatis的,这种思维我们也可以利用在其他地点。

 

概念一个接口

public interface MethodInterface { String helloWorld(); }

 

落实动态代理接口

public class MethodProxy<T> implements InvocationHandler {
    private Class<T> methodInterface;

    public MethodProxy(Class<T> methodInterface) {
        this.methodInterface = methodInterface;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("=========================");
        System.out.println("方法名:" + method.getName());
        //针对不同的方法进行不同的操作
        return null;
    }
}

 

此处针对invoke办法简便说说MyBatis的兑现原理,在该措施中,大家透过Method可以得到接口和措施名,接口的姓名相当于MyBatis
XML中的namespace,方法名相当于实际一个方法中的id。也就是说通过动态代理后,可以经过SqlSession来通过namespace.id艺术来调用相应的不二法门。使用接口更有利于,不过是一种直接的模式。

 

动态代理工厂类

public class MethodProxyFactory {
    public static <T> T newInstance(Class<T> methodInterface) {
        final MethodProxy<T> methodProxy = new MethodProxy<T>(methodInterface);
        return (T) Proxy.newProxyInstance(
                Thread.currentThread().getContextClassLoader(), 
                new Class[]{methodInterface}, 
                methodProxy);
    }
}

由此该工厂类可以转移任意接口的动态代理类。

 

测试

 

MethodInterface method = MethodProxyFactory.newInstance(MethodInterface.class);
method.helloWorld();

总结

诚如谈到动态代理我们不足为奇的用法都是处理事务、日志或者记录形式执行效能等地方的运用。都是对落实类措施的放置或者后置的出格处理。

由此本文,其实可以见见另一种接纳方向,这就是不需要贯彻类,直接通过动态代理执行接口方法,MyBatis使用这种措施方便了我们调用方法,利用那种思路大家恐怕可以在此外地点做出一些更好的设计。

 

原文:http://blog.csdn.net/isea533/article/details/48296849

网站地图xml地图