springboot 多數據源配置實現及分析


今天遇到一個任務,需要把oracle上的數據遷移到mysql中,表的字段及結構並不完全相同,還需要寫一些代碼去對應。

這種小工程適合用springboot快速搭建,用mybatis+spring去實現。

但是我沒怎么用過springboot,只能去網上找現成的代碼,再根據具體的業務改一改:

SpringBoot2.0之八 多數據源配置

如果只會復制粘貼,那我永遠都只能是一個麻瓜,所以必須要把這一段代碼全部學會。

 1 @Configuration
 2 @MapperScan(basePackages = "com.somta.springboot.dao.master", sqlSessionTemplateRef  = "masterSqlSessionTemplate")
 3 public class MasterDataSourceConfiguration {
 4 
 5     @Value("${spring.datasource.master.driver-class-name}")
 6     private String driverClassName;
 7 
 8     @Value("${spring.datasource.master.url}")
 9     private String url;
10 
11     @Value("${spring.datasource.master.username}")
12     private String username;
13 
14     @Value("${spring.datasource.master.password}")
15     private String password;
16 
17     @Bean(name = "masterDataSource")
18     @Primary
19     public DataSource dataSource() {
20         DruidDataSource dataSource = new DruidDataSource();
21         dataSource.setDriverClassName(this.driverClassName);
22         dataSource.setUrl(this.url);
23         dataSource.setUsername(this.username);
24         dataSource.setPassword(this.password);
25         return dataSource;
26     }
27 
28     @Bean(name = "masterSqlSessionFactory")
29     @Primary
30     public SqlSessionFactory sqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
31         SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
32         bean.setDataSource(dataSource);
33         bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mybatis/master/**/Mysql_*Mapper.xml"));
34         return bean.getObject();
35     }
36 
37     @Bean(name = "masterTransactionManager")
38     @Primary
39     public DataSourceTransactionManager transactionManager(@Qualifier("masterDataSource") DataSource dataSource) {
40         return new DataSourceTransactionManager(dataSource);
41     }
42 
43     @Bean(name = "masterSqlSessionTemplate")
44     @Primary
45     public SqlSessionTemplate sqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
46         return new SqlSessionTemplate(sqlSessionFactory);
47     }
48 
49 }

這是整個配置中的核心就是這一段代碼了,我們來仔細研究一下:

@Configuration注解

自spring3.0以后,用於定義配置類,可以替代xml文件。被注解的類中包含一個或多個@bean注解的方法,這些方法將會被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext類進行掃描,並用於構建bean定義,初始化Spring容器。

簡單地說,就是把spring中的配置文件

<beans>
    <bean>
    </bean>
    ....
</beans>

這種配置用注解的形式替換掉

那么依次看代碼中被@bean注解的方法:

 1 @Bean(name = "masterDataSource")
 2 @Primary
 3 public DataSource dataSource() {
 4       DruidDataSource dataSource = new DruidDataSource();
 5       dataSource.setDriverClassName(this.driverClassName);
 6       dataSource.setUrl(this.url);
 7       dataSource.setUsername(this.username);
 8       dataSource.setPassword(this.password);
 9       return dataSource;
10 }

這就相當於向spring容器中注冊了一個id為"masterDataSource"的bean,同時在代碼中設定好參數,就配置好數據源。

1 @Bean(name = "masterSqlSessionFactory")
2 @Primary
3 public SqlSessionFactory sqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
4         SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
5         bean.setDataSource(dataSource);
6         bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mybatis/master/**/Mysql_*Mapper.xml"));
7         return bean.getObject();
8     }

 

向ico容器注冊一個id為"masterDataSource"的bean,SqlSessionFactory是myBatis的核心類,用於生成sqlSession

MyBatis常用對象SqlSessionFactory和SqlSession介紹和運用

 

1 @Bean(name = "masterTransactionManager")
2     @Primary
3     public DataSourceTransactionManager transactionManager(@Qualifier("masterDataSource") DataSource dataSource) {
4         return new DataSourceTransactionManager(dataSource);
5     }

注冊一個id為"masterTranscationManager"的bean,DataSourceTransactionManager是spring事務管理的核心類

Spring3.1.0實現原理分析(二十二).Dao事務分析之事務管理器DataSourceTransactionManager

 

1 @Bean(name = "masterSqlSessionTemplate")
2     @Primary
3     public SqlSessionTemplate sqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
4         return new SqlSessionTemplate(sqlSessionFactory);
5     }

注冊一個id為"masterSqlSessionTemplate"的bean,SqlSessionTemplate是spring事務管理的核心類

https://www.cnblogs.com/daxin/p/3544188.html

 

還有個需要注意的地方時,以上bean在引入其他依賴bean時,使用的時注解@Qualifier("beanName")。這樣做是因為要配置兩個數據源,DataSource、SqlSessionFaction、DataSourceTransactionManager、SqlSessionTemplate還會在另一個數據源中配置,需要通過名稱來區分。

 

上述代碼加注解的作用相當於以下xml配置文件:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
 4     xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
 5     xsi:schemaLocation="http://www.springframework.org/schema/beans 
 6       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
 7       http://www.springframework.org/schema/aop 
 8       http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
 9       http://www.springframework.org/schema/context 
10       http://www.springframework.org/schema/context/spring-context-3.0.xsd
11       http://www.springframework.org/schema/tx 
12       http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
13  ">
14  
15     <bean id="dataSource"
16         class="org.springframework.jdbc.datasource.DriverManagerDataSource">
17         <property name="driverClassName">
18             <value>org.gjt.mm.mysql.Driver</value>
19         </property>
20         <property name="url">
21             <value>jdbc:mysql://localhost:3306/zdy?useUnicode=true&characterEncoding=UTF-8
22             </value>
23         </property>
24         <property name="username">
25             <value>root</value>
26         </property>
27         <property name="password">
28             <value>1111</value>
29         </property>
30     </bean>
31     
32         <!-- 獲取會話工廠,並注入Mybatis,和dateSource數據庫鏈接 -->
33     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
34         <property name="dataSource" ref="dataSource"></property>
35         <property name="configLocation" value="bs/Mybatis.xml"></property>
36     </bean>
37     
38         <!-- 在會話工廠中取出SqlSessionTemplate這個對象 -->
39      <bean id="sqlsessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
40         <constructor-arg index="0" ref="sqlSessionFactory" />
41     </bean>
42         
43         <!-- 把sqlsessionTemplate注入到UserMapper中去。UserMapper才能對數據進行操作 -->
44     <bean id="user" class="bs.UserImpl">
45     <property name="sqlsession" ref="sqlsessionTemplate">
46     </property>
47     </bean>

 

還有一個注解@MapperScan,用於注解掃描到的對應的mapper,然后在使用mapper下的bean的數據庫操作就會使用上述配置的數據源及相關bena。

 

沒怎么用過springboot,不太熟悉springboot的文件結構,這個mapper好像類似傳統ssm框架下的dao層文件,等我再學習學習。

寫了半天才發現這個玩意這些注解配置和之前的ssm框架原理是一樣的,只是通過注解簡化了大量操作,而且搭建起來也更加便捷。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM