这段时间在使用spring+mybatis整合时遇到了一个问题,我想引用外部jdbc.properties,然后在配置文件中使用占位符,如下:
<!--引入属性文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--数据库连接-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass"><value>${jdbc.driverClassName}</value></property>
<property name="jdbcUrl"><value>${jdbc.url}</value></property>
<property name="user"><value>${jdbc.username}</value></property>
<property name="password"><value>${jdbc.password}</value></property>
</bean>
但是我发现出现了以下异常:
WARN [com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2] - Could not load driverClass ${jdbc.driverClassName}
java.lang.ClassNotFoundException: ${jdbc.driverClassName}
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:190)
at com.mchange.v2.c3p0.DriverManagerDataSource.ensureDriverLoaded(DriverManagerDataSource.java:100)
at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:132)
at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:182)
at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:171)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:137)
at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1014)
at com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32)
at com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810)
at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
这个问题是无法识别占位符,就是在加载过程中直接把$(jdbc.driverClassName)当做字符串处理了。后来在网上找过问题的解决方式,是说因为配置了
<!-- 扫描接口所在的包 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.xx.dao"/>
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
MapperScannerConfigurer 先于properties文件处理,意思是没进行占位符的变量赋值就被使用了。去掉sqlSessionFactory这个属性
<!-- 扫描接口所在的包 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.xx.dao"/>
</bean>
同时记得加上这样的bean,id一定是这样,因为要使用的时候会去找这个bean
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:config.xml" />
<property name="mapperLocations">
<value>classpath:dao/mapper/*Mapper.xml</value>
</property>
</bean>
ps:同时注意beans 可能会配置有这个 default-autowire="byName" ,去掉即可。