一、首先項目中使用的是Mybatis3.2.2 + Spring3.2.2,同時使用了mybatis-spring-1.2.0.jar來做Mybatis與Spring的整合。
二、使用了Mybatis推薦的mapper加載方式:
<!-- mybatis配置 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="writeDataSource" /> <property name="mapperLocations" value="classpath*:com/baofoo/admin/dao/**/impl/*Mapper.xml" /> </bean> <!-- mybatis自動掃描包下的mapper --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.baofoo.admin.dao" /> <!-- <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> --> </bean>
值得需要注意的是,在配置MapperScannerConfigurer時,這裏並沒有指定sqlSessionFactoryName以及sqlTemplateName。在沒有指定的情況下,spring就會指定默認的查找規則進行查詢,如分別查找到默認的sqlSessionFactory實現和sqlSessionTemplate實現,並注入到MapperFactoryBean中。
這種配置方式,在一個數據源時,沒有問題,但是在如果存在多個數據源時,上面的配置就存在問題了。在多個數據源時,如果配置不正確,或者配置的步驟不正確,將直接產生莫名奇妙的問題
最初從tomcat啓動一切正常,然後後面突然啓動服務時報出如下異常:
java.lang.NoClassDefFoundError: Could not initialize class org.springframework.beans.factory.BeanCreationException at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:532) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:626) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479) at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:651) at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:599) at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:665) at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:518) at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:459) at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136) at javax.servlet.GenericServlet.init(GenericServlet.java:160) at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1274) at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1186) at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1081) at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5033) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5320) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633) at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:657) at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1637) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:619)
我的解決方案是在“MapperScannerConfigurer”配置爲其指定“sqlSessionFactoryBeanName”,於是修改配置如下:
<!-- mybatis自動掃描包下的mapper --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.baofoo.admin.dao" /> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> <!-- 指定sqlSessionFactoryName --> </bean>
注:以上問題爲本人在實戰項目中解決問題的理解