fix: 修复在 Controller 通过注解配置数据源不生效的问题

This commit is contained in:
开源海哥 2023-07-21 09:01:32 +08:00
parent 0e750622f6
commit 3b65108f0f
8 changed files with 44 additions and 30 deletions

View File

@ -32,8 +32,9 @@ import java.util.Iterator;
/** /**
* <p>判断是否有 MyBatis-Flex 的多数据源配置 * <p>判断是否有 MyBatis-Flex 的多数据源配置
*
* <p>如果配置文件中有 MyBatis-Flex 的多数据源配置就加载 MyBatis-Flex 多数据源自动配置类 * <p>如果配置文件中有 MyBatis-Flex 的多数据源配置就加载 MyBatis-Flex 多数据源自动配置类
*
* @author michael
*/ */
@Target({ElementType.TYPE, ElementType.METHOD}) @Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME) @Retention(RetentionPolicy.RUNTIME)

View File

@ -19,6 +19,7 @@ import com.mybatisflex.core.mybatis.FlexConfiguration;
/** /**
* {@link FlexConfiguration} 做自定义的配置支持 * {@link FlexConfiguration} 做自定义的配置支持
* @author michael
*/ */
@FunctionalInterface @FunctionalInterface
public interface ConfigurationCustomizer { public interface ConfigurationCustomizer {

View File

@ -28,6 +28,7 @@ import org.springframework.transaction.annotation.TransactionManagementConfigure
/** /**
* MyBatis-Flex 事务自动配置 * MyBatis-Flex 事务自动配置
* @author michael
*/ */
@ConditionalOnClass(Db.class) @ConditionalOnClass(Db.class)
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)

View File

@ -17,12 +17,8 @@ package com.mybatisflex.spring.boot;
import com.mybatisflex.core.datasource.DataSourceBuilder; import com.mybatisflex.core.datasource.DataSourceBuilder;
import com.mybatisflex.core.datasource.FlexDataSource; import com.mybatisflex.core.datasource.FlexDataSource;
import com.mybatisflex.spring.datasource.DataSourceAdvice;
import com.mybatisflex.spring.datasource.DataSourceInterceptor;
import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.aop.Advisor;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@ -30,7 +26,6 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Role;
import javax.sql.DataSource; import javax.sql.DataSource;
import java.util.Map; import java.util.Map;
@ -38,6 +33,7 @@ import java.util.Map;
/** /**
* MyBatis-Flex 多数据源的配置支持 * MyBatis-Flex 多数据源的配置支持
* @author michael
*/ */
@ConditionalOnMybatisFlexDatasource() @ConditionalOnMybatisFlexDatasource()
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@ -73,14 +69,4 @@ public class MultiDataSourceAutoConfiguration {
return flexDataSource; return flexDataSource;
} }
/**
* {@link com.mybatisflex.annotation.UseDataSource} 注解切换数据源切面
*/
@Bean
@ConditionalOnMissingBean
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
public Advisor dataSourceAdvice() {
return new DataSourceAdvice(new DataSourceInterceptor());
}
} }

View File

@ -28,6 +28,7 @@ import com.mybatisflex.core.table.TableManager;
import com.mybatisflex.core.tenant.TenantFactory; import com.mybatisflex.core.tenant.TenantFactory;
import com.mybatisflex.core.tenant.TenantManager; import com.mybatisflex.core.tenant.TenantManager;
import com.mybatisflex.spring.FlexSqlSessionFactoryBean; import com.mybatisflex.spring.FlexSqlSessionFactoryBean;
import com.mybatisflex.spring.datasource.DataSourceAdvice;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.mapping.DatabaseIdProvider; import org.apache.ibatis.mapping.DatabaseIdProvider;
import org.apache.ibatis.plugin.Interceptor; import org.apache.ibatis.plugin.Interceptor;
@ -41,6 +42,7 @@ import org.mybatis.spring.mapper.MapperFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer; import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.aop.Advisor;
import org.springframework.beans.BeanWrapper; import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl; import org.springframework.beans.BeanWrapperImpl;
import org.springframework.beans.factory.*; import org.springframework.beans.factory.*;
@ -55,10 +57,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandi
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.EnvironmentAware; import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.*;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.env.Environment; import org.springframework.core.env.Environment;
import org.springframework.core.io.Resource; import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader; import org.springframework.core.io.ResourceLoader;
@ -414,4 +413,16 @@ public class MybatisFlexAutoConfiguration implements InitializingBean {
} }
/**
* {@link com.mybatisflex.annotation.UseDataSource} 注解切换数据源切面
*/
@Bean
@ConditionalOnMissingBean
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
public Advisor dataSourceAdvice() {
return new DataSourceAdvice();
}
} }

View File

@ -32,19 +32,23 @@ import org.springframework.aop.support.annotation.AnnotationMethodMatcher;
*/ */
public class DataSourceAdvice extends AbstractPointcutAdvisor { public class DataSourceAdvice extends AbstractPointcutAdvisor {
private final DataSourceInterceptor advice; private final Advice advice;
private final Pointcut pointcut;
public DataSourceAdvice(DataSourceInterceptor advice) { public DataSourceAdvice() {
this.advice = advice; this.advice = new DataSourceInterceptor();
AnnotationMatchingPointcut cpc = new AnnotationMatchingPointcut(UseDataSource.class, true);
AnnotationMethodMatcher mpc = new AnnotationMethodMatcher(UseDataSource.class);
this.pointcut = new ComposablePointcut(mpc).union(cpc);
} }
@Override @Override
public Pointcut getPointcut() { public Pointcut getPointcut() {
AnnotationMatchingPointcut cpc = new AnnotationMatchingPointcut(UseDataSource.class, true); return pointcut;
AnnotationMethodMatcher mpc = new AnnotationMethodMatcher(UseDataSource.class);
return new ComposablePointcut(cpc).union(mpc);
} }
@Override @Override
public Advice getAdvice() { public Advice getAdvice() {
return this.advice; return this.advice;

View File

@ -43,7 +43,6 @@ public class DataSourceInterceptor implements MethodInterceptor {
@Override @Override
public Object invoke(MethodInvocation invocation) throws Throwable { public Object invoke(MethodInvocation invocation) throws Throwable {
String dsKey = DataSourceKey.get(); String dsKey = DataSourceKey.get();
if (StringUtil.isNotBlank(dsKey)) { if (StringUtil.isNotBlank(dsKey)) {
return invocation.proceed(); return invocation.proceed();

View File

@ -15,6 +15,8 @@
*/ */
package com.mybatisflex.test.controller; package com.mybatisflex.test.controller;
import com.mybatisflex.annotation.UseDataSource;
import com.mybatisflex.core.datasource.DataSourceKey;
import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.row.Db; import com.mybatisflex.core.row.Db;
@ -31,6 +33,7 @@ import javax.annotation.Resource;
import java.util.List; import java.util.List;
@RestController @RestController
@UseDataSource("ds3333")
public class AccountController { public class AccountController {
@Resource @Resource
@ -106,4 +109,12 @@ public class AccountController {
return accountMapper.paginate(pageNumber, pageSize, QueryWrapper.create()); return accountMapper.paginate(pageNumber, pageSize, QueryWrapper.create());
} }
@GetMapping("/ds")
@UseDataSource("ds2222")
public String ds() {
return ">>>>>ds: " + DataSourceKey.get();
}
} }