dao的迁移的数据源问题
老师,本章讲述将SSM项目换成SpringBoot框架,在dao层迁移的过程,视频演示的是将原本的spring-dao.xml的配置文件分解成两个@Configuration注解的类,如下:
原本的spring-dao.xml:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 配置整合mybatis过程 --> <!-- 1.配置数据库相关参数properties的属性:${url} --> <context:property-placeholder location="classpath:jdbc.properties" ignore-unresolvable="true"/> <context:property-placeholder location="classpath:redis.properties" ignore-unresolvable="true"/> <!-- <bean class="com.imooc.o2o.util.EncryptPropertyPlaceholderConfigurer">--> <!-- <property name="locations">--> <!-- <list>--> <!-- <value>classpath:jdbc.properties</value>--> <!-- <value>classpath:redis.properties</value>--> <!-- </list>--> <!-- </property>--> <!-- <property name="fileEncoding" value="UTF-8" />--> <!-- </bean>--> <!-- 2.数据库连接池 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <!--配置连接池属性--> <property name="driverClass" value="${jdbc.driver}"/> <property name="jdbcUrl" value="${jdbc.url}"/> <property name="user" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <!-- c3p0连接池的私有属性 --> <property name="maxPoolSize" value="40" /> <property name="minPoolSize" value="10" /> <!-- 关闭连接后不自动commit --> <property name="autoCommitOnClose" value="false" /> <!-- 获取连接超时时间 --> <property name="checkoutTimeout" value="10000" /> <!-- 当获取连接失败重试次数 --> <property name="acquireRetryAttempts" value="2" /> </bean> <!-- 3.配置SqlSessionFactory对象 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 注入数据库连接池 --> <property name="dataSource" ref="dataSource" /> <!-- 配置MyBaties全局配置文件:mybatis-config.xml --> <property name="configLocation" value="classpath:mybatis-config.xml" /> <!-- 扫描entity包 使用别名 --> <property name="typeAliasesPackage" value="com.imooc.o2o.entity" /> <!-- 扫描sql配置文件:mapper需要的xml文件 --> <property name="mapperLocations" value="classpath:mapper/*.xml" /> </bean> <!-- 4.配置扫描Dao接口包,动态实现Dao接口,注入到spring容器中 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- 注入sqlSessionFactory --> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> <!-- 给出需要扫描Dao接口包 --> <property name="basePackage" value="com.imooc.o2o.dao" /> </bean> </beans>
DataSourceConfiguration.java:
package com.imooc.o2o.config.dao; import java.beans.PropertyVetoException; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.imooc.o2o.util.DESUtil; import com.mchange.v2.c3p0.ComboPooledDataSource; /** * 配置datasource到ioc容器里面 * * @author xiangze * */ @Configuration // 配置mybatis mapper的扫描路径 @MapperScan("com.imooc.o2o.dao") public class DataSourceConfiguration { @Value("${jdbc.driver}") private String jdbcDriver; @Value("${jdbc.url}") private String jdbcUrl; @Value("${jdbc.username}") private String jdbcUsername; @Value("${jdbc.password}") private String jdbcPassword; /** * 生成与spring-dao.xml对应的bean dataSource * * @return * @throws PropertyVetoException */ @Bean(name = "dataSource") public ComboPooledDataSource createDataSource() throws PropertyVetoException { // 生成datasource实例 ComboPooledDataSource dataSource = new ComboPooledDataSource(); // 跟配置文件一样设置以下信息 // 驱动 dataSource.setDriverClass(jdbcDriver); // 数据库连接URL dataSource.setJdbcUrl(jdbcUrl); // 设置用户名 dataSource.setUser(DESUtil.getDecryptString(jdbcUsername)); // 设置用户密码 dataSource.setPassword(DESUtil.getDecryptString(jdbcPassword)); // 配置c3p0连接池的私有属性 // 连接池最大线程数 dataSource.setMaxPoolSize(30); // 连接池最小线程数 dataSource.setMinPoolSize(10); // 关闭连接后不自动commit dataSource.setAutoCommitOnClose(false); // 连接超时时间 dataSource.setCheckoutTimeout(10000); // 连接失败重试次数 dataSource.setAcquireRetryAttempts(2); return dataSource; } }
SessionFactoryConfiguration.java:
package com.imooc.o2o.config.dao; import java.io.IOException; import javax.sql.DataSource; import org.mybatis.spring.SqlSessionFactoryBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver; @Configuration public class SessionFactoryConfiguration { // mybatis-config.xml配置文件的路径 private static String mybatisConfigFile; @Value("${mybatis_config_file}") public void setMybatisConfigFile(String mybatisConfigFile) { SessionFactoryConfiguration.mybatisConfigFile = mybatisConfigFile; } // mybatis mapper文件所在路径 private static String mapperPath; @Value("${mapper_path}") public void setMapperPath(String mapperPath) { SessionFactoryConfiguration.mapperPath = mapperPath; } // 实体类所在的package @Value("${type_alias_package}") private String typeAliasPackage; @Autowired private DataSource dataSource; /** * 创建sqlSessionFactoryBean 实例 并且设置configtion 设置mapper 映射路径 设置datasource数据源 * * @return * @throws IOException */ @Bean(name = "sqlSessionFactory") public SqlSessionFactoryBean createSqlSessionFactoryBean() throws IOException { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); // 设置mybatis configuration 扫描路径 sqlSessionFactoryBean.setConfigLocation(new ClassPathResource(mybatisConfigFile)); // 添加mapper 扫描路径 PathMatchingResourcePatternResolver pathMatchingResourcePatternResolver = new PathMatchingResourcePatternResolver(); String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + mapperPath; sqlSessionFactoryBean.setMapperLocations(pathMatchingResourcePatternResolver.getResources(packageSearchPath)); // 设置dataSource sqlSessionFactoryBean.setDataSource(dataSource); // 设置typeAlias 包扫描路径 sqlSessionFactoryBean.setTypeAliasesPackage(typeAliasPackage); return sqlSessionFactoryBean; } }
对此,我有点不解
这两个@Configuration注解的类是怎么关联起来的啊?它们是从一个xml文件迁移出来的,按理说它们应该有关联才对不是么?
从spring-dao.xml文件可以看出SqlSessionFactoryBean的注入数据源的是注入上面定义好的C3P0数据源,可是迁移出来的两个@Configuration注解类,DataSourceConfiguration引入的数据源是import com.mchange.v2.c3p0.ComboPooledDataSource,即C3P0的数据源,但是SessionFactoryConfiguration引入的数据源是import javax.sql.DataSource,是另一个数据源。但是在原本的spring-dao.xml中,SqlSessionFactoryBean注入的数据源就是在上面自定义好的C3P0数据源,这是怎么回事?
再有就是,在原本SSM框架中,是在项目的web.xml里设置DispatcherServlet的初始化参数contextConfigLocation为classpath:spring/spring-*.xml,这样读取了三个配置文件的信息,应用于程序中,可是切换后的SpringBoot并没有读取的操作呀,怎么就能应用上这些配置了呢?难道是因为@Configuration这个注解已经告诉了SpringBoot这是个配置类,里面是一些配置信息,程序运行之前要加载这些信息,是这个意思么?
正在回答
同学你好,javax.sql.DataSource;的DataSource是一个接口,ComboPooledDataSource的DataSource经过多重继承,继承自javax.sql.DataSource,所以可以转换,例如:
如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~
- 参与学习 人
- 提交作业 323 份
- 解答问题 8263 个
本阶段将带你学习主流框架SSM,以及SpringBoot ,打通成为Java工程师的最后一公里!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星