Mybatis源码分析—Mapper创建和Spring的管理

本文深入探讨了Mybatis中Mapper的创建过程以及如何将其整合到Spring的IOC管理中。从Mapper的动态代理创建,到Spring管理Mapper的多种思路,包括通过XML配置、@MapperScan注解以及自定义实现,最后详细解析了MapperScan的工作原理,阐述了Spring如何根据MapperFactoryBean创建并注册Mapper到IoC容器。
摘要由CSDN通过智能技术生成

mapper 创建

 

  • 因为mybatis可以脱离spring自己使用,所以mapper的bean创建是由mybatis完成的
  • 创建方式,根据不同的mapper,方法都是对应与注解或者配置文件对应名称的方法,所以我们猜测使用的是spring的动态代理创建方式

我们自己实现mapper创建工厂代理类:

public class MySessionFactoryProxy {
    public static Object getMapper(Class c){
        Class[] classes = new Class[]{c};
        //动态代理获取mapper
        Object o = Proxy.newProxyInstance(MySessionFactoryProxy.class.getClassLoader(), classes, new InvocationHandler() {
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //解析sql
                //执行sql
                Select annotation = method.getAnnotation(Select.class);
                String sql = annotation.value()[0];//一个注解可能有多个sql语句
                System.out.println("sql:"+sql);
                return null;
            }
        });
        return o;
    }
}复制代码

 

那么由谁来调用这个getMapper方法呢,毫无疑问是mybatis,这个时候需要一个工厂bean,用来调用该方法,每次调用,创建一个factoryBean,传入一个mapper类,来创建该mapper(这样就可以解决代码写死的情况)

  • MyMapperFactoryBean
public class MyMapperFactoryBean<T> implements FactoryBean<T> {

    //实例化的时候传入
    public MyMapperFactoryBean(Class<T> mapperInterface) {
        this.mapperInterface = mapperInterface;
    }

    //使用全局变量存储不同的mapper类
    private Class<T> mapperInterface;

    public T getObject() throws Exception {
        System.out.println("get mapper");
        return (T) MySessionFactoryProxy.getMapper(mapperInterface);
    }

    public Class<?> getObjectType() {
        return this.mapperInterface;
    }
}复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值