配置ssm框架遇到的一个坑(<context:property-placeholder>占位符配置失效)

来源:互联网 发布:机器人编程语言py 编辑:程序博客网 时间:2024/06/07 00:48

最近几天在学习ssm框架,spring mvc+spring+mybatis。配置完毕后测试数据源时一直报错,连接不上,一开始是这个jdbc.driver{jdbc.driver}解析成了字符串常量,就试了将${jdbc.driver}改成直接的字符串常量com.mysql.jdbc.Driver,结果没有了CassNotFoundException,但是还是连接不上,哎,智商有点捉急,没有将其他的数据源配置信息,由这种占位符的形式全部改成字符串常量,犯傻了,主要是当时比较烦躁.然后在网上百度了下,然后网上给的答案也明确了后面的那种报错,需要检查配置信息:driverClass,jdbcUrl,user,password是否配置正确。我就感觉自己在属性文件jdbc.properties中配置的都是对的,没有联系到由于占位符都直接当作了字符常量,导致信息不对。
然后无奈之下,索性都改成了字符串常量,去掉占位符的形式(时间已过去三个小时,期间一直在打发时间),结果成功了,能连接上数据库。当时真想扇自己一耳光。然后我就纳闷明明我已经配置了<context:property-placeholder location="classpath:jdbc.properties">为什么就没生效呢,而且我配置的位置是在spring_application_context.xml这个spring 应用上下文xml文件的最上面的位置,不应该出现加载bean时未解析到的情况。然后我就百度了下,网上说的是要么直接将
<!-- 扫描dao包下的 interface -->
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.lcz.ssm.dao"></property>
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>

上面的第二个sqlSessionFactory属性配置删除,要么这行改成
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>(注意这里后面是value,这个sqlSessionFactoryBeanName属性在MapperScannerConfigurer类中为String类型变量)。这里问题已经明朗了,然后我很奇怪,为什么这么搞就没问题了,然后我看了下源码上该方面的注释,顿时豁然开朗。

![这里写图片描述](http://img.blog.csdn.net/20170508215349605?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzMzMTc1Njg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)       这里javaDoc中很明确地说了:翻译过来就是-----该方法在spring 上下文中不止一个SqlSessionFactory的情况下用来指定使用哪个SqlSessionFactory.通常这个仅当你有不止一个数据源时才需要使用。     注意这里使用的是bean的名字,不是bean的引用。这是由于在开始阶段,这个scanner类加载的比较早,过早地构造mybatis 对象实例。  这么一来我想上面我那种做法之所以导致占位符失效,大概就是因为,MapperScannerConfigurer这个类在spring ioc容器中创建较早,如果直接引用sqlSessionFactory的话,导致这个bean也过早创建,而占位符那个类PropertySourcesPlaceholderConfigurer此时还没有创建,自然未注册到spring 应用上下文中去,因而导致占位符失效。   另外可以看到下面这个方法已经废弃。 @Deprecated

public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
感觉这个方法废弃估计跟这个也有关系吧。另外再补充点自己配置ssm遇到的坑,也是关于jdbc.properties属性文件的,那就是你在配置jdbc.properties时千万要注意属性值后面空格问题,属性值前面空格会看作属性名属性值之间的分隔符,不会计入属性值的一部分,而属性值后面的空格会算作属性值字符串的一部分。另外还有一点就是属性名,最好不要取作username,这样很有可能在spring 应用上下文文件中会被系统username变量值所覆盖,结果${username}的取值就变成你的环境变量user的值了, 比如Administrator,从而无法连接上数据库。

0 0