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

本文深入分析了Mybatis中Mapper的创建过程以及如何与Spring进行集成管理。首先介绍了Mapper的创建,利用Spring的动态代理实现,接着讨论了如何将创建的Mapper放入Spring的IOC容器中,提出了多种思路,包括自定义MapperFactoryBean、XML配置以及使用MapperScan注解配合ImportBeanDefinitionRegistrar。最后总结了Mybatis通过MapperScan注册工厂bean到Spring,并在启动时由Spring调用工厂创建Mapper并管理。
摘要由CSDN通过智能技术生成

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

我们分析的时候先自己猜测实现方式再对比mybatis的源码实现方式

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

    pub
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值