增加了multi-tenant-core, multi-tenant-datasource ,未完全测试
diff --git a/multi-tenant-datasource/build.gradle b/multi-tenant-datasource/build.gradle
new file mode 100644
index 0000000..09ed014
--- /dev/null
+++ b/multi-tenant-datasource/build.gradle
@@ -0,0 +1,29 @@
+plugins {
+    id "java-library"
+    id "org.springframework.boot"
+}
+
+jar {
+    enabled = true
+    archiveFileName = "${project.name}-${buildVersion}.${archiveExtension.getOrElse('.jar')}"
+    manifest {
+        attributes('Implementation-Title': project.name,
+                'Implementation-Version': buildVersion)
+    }
+}
+println("Build Version: $buildVersion")
+bootJar {
+    enabled = false
+}
+
+dependencies {
+    implementation(":multi-tenant-core")
+    implementation "org.springframework.boot:spring-boot-autoconfigure"
+    implementation "commons-beanutils:commons-beanutils:${beanutilsVersion}"
+    implementation "commons-codec:commons-codec:${codecVersion}"
+    implementation "org.apache.commons:commons-lang3:${lang3Version}"
+
+    compileOnly "org.projectlombok:lombok:${lombokVersion}"
+    annotationProcessor "org.projectlombok:lombok:${lombokVersion}"
+}
+
diff --git a/multi-tenant-datasource/src/main/java/com/supwisdom/payapi/multitenant/DefaultMultiTenantFactory.java b/multi-tenant-datasource/src/main/java/com/supwisdom/payapi/multitenant/DefaultMultiTenantFactory.java
new file mode 100644
index 0000000..898e647
--- /dev/null
+++ b/multi-tenant-datasource/src/main/java/com/supwisdom/payapi/multitenant/DefaultMultiTenantFactory.java
@@ -0,0 +1,4 @@
+package com.supwisdom.payapi.multitenant;
+
+public class DefaultMultiTenantFactory implements MultiTenantFactory {
+}
diff --git a/multi-tenant-datasource/src/main/java/com/supwisdom/payapi/multitenant/MultiTenantFactory.java b/multi-tenant-datasource/src/main/java/com/supwisdom/payapi/multitenant/MultiTenantFactory.java
new file mode 100644
index 0000000..1c829f8
--- /dev/null
+++ b/multi-tenant-datasource/src/main/java/com/supwisdom/payapi/multitenant/MultiTenantFactory.java
@@ -0,0 +1,5 @@
+package com.supwisdom.payapi.multitenant;
+
+public interface MultiTenantFactory {
+
+}
diff --git a/multi-tenant-datasource/src/main/java/com/supwisdom/payapi/multitenant/TenantContext.java b/multi-tenant-datasource/src/main/java/com/supwisdom/payapi/multitenant/TenantContext.java
new file mode 100644
index 0000000..4236e29
--- /dev/null
+++ b/multi-tenant-datasource/src/main/java/com/supwisdom/payapi/multitenant/TenantContext.java
@@ -0,0 +1,15 @@
+package com.supwisdom.payapi.multitenant;
+
+import com.supwisdom.payapi.multitenant.beans.TenantProps;
+
+public class TenantContext {
+  private static final ThreadLocal<TenantProps> tenantHolder = new ThreadLocal<>();
+
+  public static TenantProps getTenant() {
+    return tenantHolder.get();
+  }
+
+  public static void setTenant(String tenant) {
+
+  }
+}
diff --git a/multi-tenant-datasource/src/main/java/com/supwisdom/payapi/multitenant/beans/TenantProps.java b/multi-tenant-datasource/src/main/java/com/supwisdom/payapi/multitenant/beans/TenantProps.java
new file mode 100644
index 0000000..6e0abf8
--- /dev/null
+++ b/multi-tenant-datasource/src/main/java/com/supwisdom/payapi/multitenant/beans/TenantProps.java
@@ -0,0 +1,4 @@
+package com.supwisdom.payapi.multitenant.beans;
+
+public class TenantProps {
+}
diff --git a/multi-tenant-datasource/src/main/java/com/supwisdom/payapi/multitenant/config/HibernateConfig.java b/multi-tenant-datasource/src/main/java/com/supwisdom/payapi/multitenant/config/HibernateConfig.java
new file mode 100644
index 0000000..3365265
--- /dev/null
+++ b/multi-tenant-datasource/src/main/java/com/supwisdom/payapi/multitenant/config/HibernateConfig.java
@@ -0,0 +1,65 @@
+package com.supwisdom.payapi.multitenant.config;
+
+
+import lombok.extern.slf4j.Slf4j;
+import org.hibernate.MultiTenancyStrategy;
+import org.hibernate.cfg.Environment;
+import org.hibernate.context.spi.CurrentTenantIdentifierResolver;
+import org.hibernate.engine.jdbc.connections.spi.MultiTenantConnectionProvider;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties;
+import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings;
+import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.orm.jpa.JpaVendorAdapter;
+import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
+import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
+
+import javax.sql.DataSource;
+import java.util.HashMap;
+import java.util.Map;
+
+@Configuration
+@Slf4j
+public class HibernateConfig {
+
+  private final JpaProperties jpaProperties;
+
+  private final HibernateProperties hibernateProperties;
+
+  public HibernateConfig(@Autowired JpaProperties jpaProperties,
+                         HibernateProperties hibernateProperties) {
+    this.jpaProperties = jpaProperties;
+    this.hibernateProperties = hibernateProperties;
+  }
+
+  @Bean
+  public JpaVendorAdapter getJpaVendorAdapter() {
+    HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
+    adapter.setGenerateDdl(true);
+    return adapter;
+  }
+
+  @Bean("entityManagerFactory")
+  public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(DataSource dataSource,
+                                                                         MultiTenantConnectionProvider multiTenantConnectionProvider,
+                                                                         CurrentTenantIdentifierResolver currentTenantIdentifierResolver) {
+    Map<String, Object> properties = new HashMap<>();
+    properties.putAll(hibernateProperties
+        .determineHibernateProperties(jpaProperties.getProperties(),
+            new HibernateSettings()));
+    properties.put(Environment.MULTI_TENANT, MultiTenancyStrategy.SCHEMA);
+    properties.put(Environment.MULTI_TENANT_CONNECTION_PROVIDER, multiTenantConnectionProvider);
+    properties.put(Environment.MULTI_TENANT_IDENTIFIER_RESOLVER, currentTenantIdentifierResolver);
+
+    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
+    em.setDataSource(dataSource);
+    em.setPackagesToScan("com.supwisdom");
+    em.setJpaPropertyMap(properties);
+    em.setJpaVendorAdapter(getJpaVendorAdapter());
+    log.info("setup multi-tenant entityManagerFactor");
+    return em;
+  }
+
+}
diff --git a/multi-tenant-datasource/src/main/java/com/supwisdom/payapi/multitenant/config/MultiTenantAutoConfiguration.java b/multi-tenant-datasource/src/main/java/com/supwisdom/payapi/multitenant/config/MultiTenantAutoConfiguration.java
new file mode 100644
index 0000000..718d869
--- /dev/null
+++ b/multi-tenant-datasource/src/main/java/com/supwisdom/payapi/multitenant/config/MultiTenantAutoConfiguration.java
@@ -0,0 +1,16 @@
+package com.supwisdom.payapi.multitenant.config;
+
+import com.supwisdom.payapi.multitenant.DefaultMultiTenantFactory;
+import com.supwisdom.payapi.multitenant.MultiTenantFactory;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class MultiTenantAutoConfiguration {
+  @Bean
+  @ConditionalOnMissingBean(MultiTenantFactory.class)
+  public MultiTenantFactory createFactory() {
+    return new DefaultMultiTenantFactory();
+  }
+}