您的位置:首页 > 编程语言 > Java开发

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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  springboot maven idea