dao的迁移的数据源问题
老师,本章讲述将SSM项目换成SpringBoot框架,在dao层迁移的过程,视频演示的是将原本的spring-dao.xml的配置文件分解成两个@Configuration注解的类,如下:
原本的spring-dao.xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | <? 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | 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积分~
来为老师/同学的回答评分吧