IntelliJ IDEA + Spring Boot + maven + (单)多数据源
2018-02-27 14:08
399 查看
New-->Project" title="">
然后Finish , 在新窗口或者当前窗口打开都可以, 等待IDE配置
当IntelliJ IDEA配置完成之后,会有项目的分层目录
先创建并配置好一个maven项目
配置pom.xml文件
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.create</groupId> <artifactId>createdatasource</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>createdatasource</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> <!--对jdbc数据库支持--> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <mainClass>com.create.CreatedatasourceApplication</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build> </project>
编写启动类 CreatedatasourceApplication
package com.create; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class CreatedatasourceApplication { public static void main(String[] args) { SpringApplication.run(CreatedatasourceApplication.class, args); } }
配置文件的设置 application.propertise
但是一般我们会将application.propertise改为yaml文件即
application.yml, 同时新增两个文件
application-dev.yml, application-prod.yml, dev是测试环境 , prod是生产环境
application.yml配置文件
spring: profiles: active: prod
里面的prod就代表当前使用的配置文件是application-prod.yml, 即生产环境
server: port: 8380 logging: path: D:\ideaworkspace\obs\logs spring: datasource: url: jdbc:mysql://数据库连接?allowMultiQueries=true&autoReconnect=true username: 用户名 password: 密码 driver-class: com.mysql.jdbc.Driver testWhileIdle : true validationQuery: SELECT 1 sql-script-encoding: utf-8 timeBetweenEvictionRunsMillis: 3600000 ReadTimeout: 60000 ConnectTimeout: 60000 datasource1: url: jdbc:mysql://数据库连接?allowMultiQueries=true&autoReconnect=true username: 用户名 password: 密码 driver-class: com.mysql.jdbc.Driver testWhileIdle : true validationQuery: SELECT 1 sql-script-encoding: utf-8 timeBetweenEvictionRunsMillis: 3600000 ReadTimeout: 60000 ConnectTimeout: 60000
创建 DynamicDataSourceContextHolder (动态数据源上下文)类
package com.create.datasource; import java.util.ArrayList; import java.util.List; /** * Created by hcf on 2017/9/29. */ public class DynamicDataSourceContextHolder { /* * 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本, * 所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 */ private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>(); /* * 管理所有的数据源id; * 主要是为了判断数据源是否存在; */ public static List<String> dataSourceIds = new ArrayList<String>(); /** * 使用setDataSourceType设置当前的 * @param dataSourceType */ public static void setDataSourceType(String dataSourceType) { contextHolder.set(dataSourceType); } public static String getDataSourceType() { return contextHolder.get(); } public static void clearDataSourceType() { contextHolder.remove(); } /** * 判断指定DataSrouce当前是否存在 */ public static boolean containsDataSource(String dataSourceId){ return dataSourceIds.contains(dataSourceId); } }
创建动态数据源类 DynamicDataSource.java 并使其继承(extends) AbstractRoutingDataSource
package com.create.datasource; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; /** * Created by hcf on 2017/9/29. */ public class DynamicDataSource extends AbstractRoutingDataSource{ @Override protected Object determineCurrentLookupKey() { /* * DynamicDataSourceContextHolder代码中使用setDataSourceType * 设置当前的数据源,在路由类中使用getDataSourceType进行获取, * 交给AbstractRoutingDataSource进行注入使用。 */ return DynamicDataSourceContextHolder.getDataSourceType(); } }
指定数据源注解类
package com.create.annotation; import java.lang.annotation.*; /** * Created by hcf on 2017/9/29. */ @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface TargetDataSource { String value(); }
创建切换数据源类 DynamicDataSourceAspect.java
package com.create.aspect; import com.create.annotation.TargetDataSource; import com.create.datasource.DynamicDataSourceContextHolder; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; /** * 切换数据源 * Created by hcf on 2017/9/29. */ @Aspect @Order(-10) @Component public class DynamicDataSourceAspect { /** * @Before("@annotation(targetDataSource)"): * 会拦截注解targetDataSource的方法 * * @param point * @param targetDataSource * @throws Throwable */ @Before("@annotation(targetDataSource)") public void changeDataSource(JoinPoint point, TargetDataSource targetDataSource) throws Throwable { //获取当前的指定的数据源; String dsId = targetDataSource.value(); //如果不在我们注入的所有的数据源范围之内,那么输出警告信息,系统自动使用默认的数据源。 if (!DynamicDataSourceContextHolder.containsDataSource(dsId)) { System.err.println("数据源[{}]不存在,使用默认数据源 > {}"+targetDataSource.value()+point.getSignature()); } else { System.out.println("Use DataSource : {} > {}"+targetDataSource.value()+point.getSignature()); //找到的话,那么设置到动态数据源上下文中。 DynamicDataSourceContextHolder.setDataSourceType(targetDataSource.value()); } } @After("@annotation(targetDataSource)") public void restoreDataSource(JoinPoint point, TargetDataSource targetDataSource) { System.out.println("Revert DataSource : {} > {}"+targetDataSource.value()+point.getSignature()); //方法执行完毕之后,销毁当前数据源信息,进行垃圾回收。 DynamicDataSourceContextHolder.clearDataSourceType(); } }
相关文章推荐
- Intellij IDEA springboot maven 配置mybatis-generator,自动从数据库中生成代码
- intellij idea + bitbucket + maven + spring-boot配置记录
- 使用 Intellij idea Springboot maven 的一个小小的问题
- intellij idea + spring boot + spring data jpa + druid + maven + mysql + thymeleaf
- intellij idea maven springMVC和SpringBoot遇到的两个小问题
- Spring Boot配置外置Tomcat和JSP视图教程(IntelliJ IDEA + Maven)
- intellij idea + spring boot + mybatis + druid + maven + mysql + thymeleaf
- Intellij IDEA+Maven+SpringMVC+HiBernate
- IntelliJ IDEA+SpringBoot中静态资源访问路径陷阱:静态资源访问404
- SpringBoot idea maven打包war
- Idea 打包maven项目 以及spring boot 的自动配置
- IDEA上创建 Maven SpringBoot + zookeeper +dubbo 实例
- SSM框架整合(IntelliJ IDEA + maven + Spring + SpringMVC + MyBatis)
- Intellij-IDEA-maven+springMVC+mybatis整合DEMO
- IntelliJ Idea SpringBoot 数据库增删改查实例
- intellij idea spring boot 模板组件热更新设置
- IntelliJ IDEA创建Web SpringMVC项目(一):创建Maven Web项目
- eclipse 使用maven 搭建 springboot+mybatis + 多数据源
- idea创建springboot项目(maven)
- SSM框架整合(IntelliJ IDEA + maven + Spring + SpringMVC + MyBatis)