refactor(extension/tenant): 将 dynamic-datasource 依赖设置为 optional

This commit is contained in:
2025-07-15 22:06:23 +08:00
parent d32c05166d
commit 778a861fa9
6 changed files with 24 additions and 25 deletions

View File

@@ -52,9 +52,9 @@ public class TenantProperties {
private String tenantIdHeader = "X-Tenant-Id";
/**
* 超级租户 ID
* 超级/默认租户 ID
*/
private Long superTenantId = 1L;
private Long superTenantId = 0L;
/**
* 忽略表(忽略拼接租户条件)

View File

@@ -30,9 +30,9 @@ public interface TenantProvider {
/**
* 根据租户 ID 获取租户上下文
*
* @param tenantId 租户 ID
* @param isVerify 是否验证有效性
* @param tenantIdAsString 租户 ID 字符串
* @param isVerify 是否验证有效性
* @return 租户上下文
*/
TenantContext getByTenantId(String tenantId, boolean isVerify);
TenantContext getByTenantId(String tenantIdAsString, boolean isVerify);
}

View File

@@ -32,6 +32,7 @@
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>

View File

@@ -16,8 +16,6 @@
package top.continew.starter.extension.tenant.autoconfigure;
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator;
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
import jakarta.annotation.PostConstruct;
@@ -25,6 +23,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
@@ -83,6 +82,7 @@ public class TenantAutoConfiguration {
*/
@Bean
@ConditionalOnMissingBean
@ConditionalOnClass(name = "com.baomidou.dynamic.datasource.DynamicRoutingDataSource")
public TenantDataSourceAdvisor tenantDataSourceAdvisor(TenantDataSourceInterceptor tenantDataSourceInterceptor) {
return new TenantDataSourceAdvisor(tenantDataSourceInterceptor);
}
@@ -92,6 +92,7 @@ public class TenantAutoConfiguration {
*/
@Bean
@ConditionalOnMissingBean
@ConditionalOnClass(name = "com.baomidou.dynamic.datasource.DynamicRoutingDataSource")
public TenantDataSourceInterceptor tenantDataSourceInterceptor(TenantDataSourceHandler tenantDataSourceHandler) {
return new TenantDataSourceInterceptor(tenantDataSourceHandler);
}
@@ -101,9 +102,9 @@ public class TenantAutoConfiguration {
*/
@Bean
@ConditionalOnMissingBean
public TenantDataSourceHandler tenantDataSourceHandler(DataSource dataSource,
DefaultDataSourceCreator dataSourceCreator) {
return new DefaultTenantDataSourceHandler((DynamicRoutingDataSource)dataSource, dataSourceCreator);
@ConditionalOnClass(name = "com.baomidou.dynamic.datasource.DynamicRoutingDataSource")
public TenantDataSourceHandler tenantDataSourceHandler(DataSource dataSource) {
return new DefaultTenantDataSourceHandler(dataSource);
}
/**
@@ -124,8 +125,8 @@ public class TenantAutoConfiguration {
*/
@Bean
@ConditionalOnMissingBean
public TenantHandler tenantHandler(TenantDataSourceHandler tenantDataSourceHandler, TenantProvider tenantProvider) {
return new DefaultTenantHandler(tenantProperties, tenantDataSourceHandler, tenantProvider);
public TenantHandler tenantHandler(TenantProvider tenantProvider) {
return new DefaultTenantHandler(tenantProperties, tenantProvider);
}
@PostConstruct

View File

@@ -16,6 +16,7 @@
package top.continew.starter.extension.tenant.handler;
import cn.hutool.extra.spring.SpringUtil;
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
import top.continew.starter.extension.tenant.TenantDataSourceHandler;
import top.continew.starter.extension.tenant.TenantHandler;
@@ -34,14 +35,10 @@ import top.continew.starter.extension.tenant.enums.TenantIsolationLevel;
public class DefaultTenantHandler implements TenantHandler {
private final TenantProperties tenantProperties;
private final TenantDataSourceHandler dataSourceHandler;
private final TenantProvider tenantProvider;
public DefaultTenantHandler(TenantProperties tenantProperties,
TenantDataSourceHandler dataSourceHandler,
TenantProvider tenantProvider) {
public DefaultTenantHandler(TenantProperties tenantProperties, TenantProvider tenantProvider) {
this.tenantProperties = tenantProperties;
this.dataSourceHandler = dataSourceHandler;
this.tenantProvider = tenantProvider;
}
@@ -50,16 +47,16 @@ public class DefaultTenantHandler implements TenantHandler {
if (!tenantProperties.isEnabled()) {
return;
}
TenantContext tenantHandler = tenantProvider.getByTenantId(tenantId.toString(), false);
TenantContext tenantContext = tenantProvider.getByTenantId(tenantId.toString(), false);
// 保存当前的租户上下文
TenantContext originalContext = TenantContextHolder.getContext();
boolean isPush = false;
try {
// 设置新的租户上下文
TenantContextHolder.setContext(tenantHandler);
TenantContextHolder.setContext(tenantContext);
// 切换数据源
if (TenantIsolationLevel.DATASOURCE.equals(tenantHandler.getIsolationLevel())) {
dataSourceHandler.changeDataSource(tenantHandler.getDataSource());
if (TenantIsolationLevel.DATASOURCE.equals(tenantContext.getIsolationLevel())) {
SpringUtil.getBean(TenantDataSourceHandler.class).changeDataSource(tenantContext.getDataSource());
isPush = true;
}
// 执行业务逻辑

View File

@@ -17,6 +17,7 @@
package top.continew.starter.extension.tenant.handler.datasource;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.creator.DataSourceProperty;
import com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator;
@@ -40,10 +41,9 @@ public class DefaultTenantDataSourceHandler implements TenantDataSourceHandler {
private final DynamicRoutingDataSource dynamicRoutingDataSource;
private final DefaultDataSourceCreator dataSourceCreator;
public DefaultTenantDataSourceHandler(DynamicRoutingDataSource dynamicRoutingDataSource,
DefaultDataSourceCreator dataSourceCreator) {
this.dynamicRoutingDataSource = dynamicRoutingDataSource;
this.dataSourceCreator = dataSourceCreator;
public DefaultTenantDataSourceHandler(DataSource dataSource) {
this.dynamicRoutingDataSource = (DynamicRoutingDataSource)dataSource;
this.dataSourceCreator = SpringUtil.getBean(DefaultDataSourceCreator.class);
}
@Override