<!-- 使用druid开源数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
<property name="driver" value="${mop.cms.driver.class}"/>
<property name="url" value="${mop.cms.jdbc.url}" />
<property name="username" value="${mop.cms.jdbc.username}" />
<property name="password" value="${mop.cms.jdbc.password}" />
<property name="initialSize" value="${mop.cms.druid.initialSize}" />
<property name="minIdle" value="${mop.cms.druid.minIdle}" />
<property name="maxActive" value="${mop.cms.druid.maxActive}" />
<property name="maxWait" value="${mop.cms.druid.maxWait}" />
<property name="timeBetweenEvictionRunsMillis"
value="${mop.cms.druid.timeBetweenEvictionRunsMillis}" />
<property name="minEvictableIdleTimeMillis"
value="${mop.cms.druid.minEvictableIdleTimeMillis}" />
<property name="validationQuery" value="${mop.cms.druid.validationQuery}" />
<property name="testWhileIdle" value="${mop.cms.druid.testWhileIdle}" />
<property name="testOnBorrow" value="${mop.cms.druid.testOnBorrow}" />
<property name="testOnReturn" value="${mop.cms.druid.testOnReturn}" />
<property name="poolPreparedStatements" value="${mop.cms.druid.poolPreparedStatements}" />
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- mybatis session factory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:sqlmap-config.xml" />
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 开启事务 -->
<tx:annotation-driven transaction-manager="txManager"/>
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 会自动将basePackage中配置的包路径下的所有dao -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
<property name="basePackage" value="com.meizu.mop.cms.mapper" />
</bean>
此时,启动会报异常,${mop.cms.driver.class}这样的表达式获取不到properties里面的值,因为MapperScannerConigurer实际是在解析加载bean定义阶段的,这个时候要是设置sqlSessionFactory的话,会导致提前初始化一些类,这个时候,PropertyPlaceholderConfigurer还没来得及替换定义中的变量,导致把表达式当作字符串复制了,解决的办法如下:
方法一:
修改<property name="sqlSessionFactory" ref="sqlSessionFactory"/>为
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
原理:使用sqlSessionFactoryBeanName注入,不会立即初始化sqlSessionFactory, 所以不会引发提前初始化问题。
方法二:
直接删掉<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
注意:在没有配置这一行时,必须配置一个以sqlSessionFactory命名的org.mybatis.spring.SqlSessionFactoryBean。