spring容器正常啓動但調用mapper失敗——Mybatis源碼分析

問題說明:spring

在一次spring啓動過程當中,忘了在mybatis-config文件下或者 spring 配置文件中配置 mapper.xml 的位置,致使服務能夠正常啓動,可是在執行相關數據庫操做的時候,會出現500錯誤。sql

思考:數據庫

既然沒有配置mapper.xml文件的地址,而且咱們採用的是ApplicationContext (至於beanFactory 和 ApplicationContext的區別能夠自行百度),service依賴的dao接口怎麼還會注入成功呢?bash

好比如下代碼段:mybatis

@Service
public class DemoServiceImpl implements IDemoService {
	@Autowired
	private DemoDao demoDao;
	.....
}
複製代碼

DemoDao 是 咱們的接口。啓動完成後,applicationContext對這個service實現類進行bean的實例化就已經完成了,也就是說這個DemoDao 就已經被注入成功了。app

Why?咱們須要知道的一點就是這個DemoDao的實現類是根據mapper文件和接口一塊兒生成的相似於 proxy 同樣的對象。不過咱們忘了一件事,咱們忘記在sqlSessionFactory 中的mapperLocations屬性中 或者在 mybatis-config文件中配置mapper的路徑,因此這個DemoDao的實現類又是如何生成成功的,並且啓動成功後執行數據庫操做又報了500?因此是爲何呢?spa


答案很簡單: FactoryBeancode


FactoryBean 簡介

看過spring aop源碼的朋友都應該知道FactoryBean的做用。xml

package org.springframework.beans.factory;
public interface FactoryBean<T> {
    T getObject() throws Exception;

    Class<?> getObjectType();

    boolean isSingleton();
}
複製代碼

spring注入的對象是Factorybean,Factorybean的getObject方法纔是返回實際的proxy。咱們能夠在mybatis源碼中看出來對象

相關文章
相關標籤/搜索