Spring-mybatis整合 获取properties 创建SQLSessionFactory失败
2016-05-16 10:27
736 查看
代码:
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="/mybatis.xml" />
</bean>
测试类:
输出结果:
如果想加载properties 配置文件的方式读取 dataSource Bean:
这时,你会发现没有问题;会得到数据库连接,但是加上SQLSessionFactory的话就会报错:
报错信息:
提示很明显:创建初始化的SQLSessionFactory失败,因为dataSource加载失败!!什么原因呢?
找了好久终于发现:
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。
自己试试吧,希望能帮到你们!
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="/mybatis.xml" />
</bean>
测试类:
输出结果:
如果想加载properties 配置文件的方式读取 dataSource Bean:
这时,你会发现没有问题;会得到数据库连接,但是加上SQLSessionFactory的话就会报错:
报错信息:
提示很明显:创建初始化的SQLSessionFactory失败,因为dataSource加载失败!!什么原因呢?
找了好久终于发现:
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。
自己试试吧,希望能帮到你们!
相关文章推荐
- Java中文分词器Ansj的使用
- java配置dbcp连接池(数据库连接池)示例分享
- 【Java】final, finally, finalize的区别
- Java操作Sqlite数据库-jdbc连接
- Java操作Sqlite数据库-jdbc连接
- Java并发编程:volatile关键字解析
- 由数据库数据类型得到JAVA对应类型的工具类
- Spring源代码解析
- 详解Java中的对象克隆
- Java 如何有效地避免内存溢出:善于利用软引用和弱引用
- Eclipse 文档注释,属性或者方法的文档注释
- 关于Java的字符串
- eclipse中使用maven库添加jar包时,出现jar包冲突的解决方案
- Swing【java】
- Freemarker与普通java
- spring经常找不到xsd
- 【Java】类执行过程
- Java 文件字符过滤流练习--银行卡信息系统(console)
- java 用 Calendar类写万年历
- Spring第一天