如果你阅读过
mybatis-spring整合包源码阅读(一)---- SqlSessionFactoryBean相关总结
mybatis-spring整合包源码阅读(二)---- MapperScannerRegistrar 相关总结
mybatis-spring整合包源码阅读(三)---- MapperFactoryBean 相关总结
那么你应该了解到,spring是通过把扫描到的DAO类解析成为BeanDefinition
,并注册到了容器中,BeanDefinition
指定的自动转配类型是AbstractBeanDefinition.AUTOWIRE_BY_TYPE
,即按照类型进行装配
正常使用注入一个DAO的代理示例
@Autowired
private TempDAO tempDAO;
你可能会说,明明是根据类型注入,注入的类型应该是MapperFactoryBean
才对,你个傻缺。看你怎么往下写
解答:实际上你说的没错,这里我最开始也很懵,归根结底的原因是对@Autowired的认知不足,解释一下吧,这里是泛型依赖注入,点我查看或者赶紧百度一番吧
百度回来,我们继续,你可能又在嘀咕,就算你说的没错,那也是MapperFactoryBean
的实现类才对,为啥我能直接调用接口方法,又在忽悠我
解答:实际上呢,spring在注入一个对象的时候,是会调用 getObject方法的,查看下MapperFactoryBean
的getObject方法
贴源码
@Override
public T getObject() throws Exception {
return getSqlSession().getMapper(this.mapperInterface);
}
懂了么,拿到的是代理对象 MapperProxy,所以你才能调用DAO的方法