baomidou / dynamic-datasource

dynamic datasource for springboot 多数据源 动态数据源 主从分离 读写分离 分布式事务
https://www.kancloud.cn/tracy5546/dynamic-datasource/2264611
Apache License 2.0
4.74k stars 1.19k forks source link

@DS注解未生效 #649

Closed klaus-cicd closed 4 months ago

klaus-cicd commented 4 months ago

Please fill it out carefully, or it will be closed. 请认真填写,不然会直接关闭。

Enviroment

JDK Version(required): 1.8

SpringBoot Version(required): 2.4.1

dynamic-datasource-spring-boot-starter Version(required): 4.2.0

druid Version(optional): 1.2.16

Describe what happened

  1. yml配置内已经配置两个数据源,一个是key叫mysql,另一个叫tdengine,primaryKey为mysql
  2. 编写了一个工具类,该工具类内注入了NamedParameterJdbcTemplate对象去执行SQL,在该工具类上加入了@DS("tdengine")注解
  3. 但是在执行该类的方法时,AOP未生效(没有进入DynamicDataSourceAnnotationInterceptor#invoke),导致DynamicDataSourceContextHolder.peek()的结果为null,导致namedParameterJdbcTemplate对象获取到的是mysql的数据源,进而导致结果异常

Expected Result:

AOP正常生效,进入DynamicDataSourceAnnotationInterceptor

Actual Result: AOP失效,未执行DynamicDataSourceAnnotationInterceptor#invoke

If there is an exception,or aop invalid,please attach the exception trace:

Just paste your stack trace here!

Steps to reproduce

huayanYu commented 4 months ago

你需要百度AOP常见失效原因, 提问也不贴工具类啥样,注解在了哪。

klaus-cicd commented 4 months ago

你需要百度AOP常见失效原因, 提问也不贴工具类啥样,注解在了哪。


@Slf4j
@DS(TDengineUtil.DS_TDENGINE)
public class TDengineUtil {
public static final String DS_TDENGINE = "tdengine";
@Getter
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
private static NamedParameterJdbcTemplate STATIC_NAMED_PARAMETER_JDBC_TEMPLATE;
private static JdbcTemplateUtil STATIC_JDBC_TEMPLATE_UTIL;
private final JdbcTemplateUtil jdbcTemplateUtil;
private final SpringContextHolder springContextHolder;

public TDengineUtil(NamedParameterJdbcTemplate namedParameterJdbcTemplate, SpringContextHolder springContextHolder, JdbcTemplateUtil jdbcTemplateUtil) {
    this.namedParameterJdbcTemplate = namedParameterJdbcTemplate;
    this.springContextHolder = springContextHolder;
    this.jdbcTemplateUtil = jdbcTemplateUtil;
    STATIC_NAMED_PARAMETER_JDBC_TEMPLATE = namedParameterJdbcTemplate;
    STATIC_JDBC_TEMPLATE_UTIL = jdbcTemplateUtil;
}

public static int insertUsing(Object object) {
    return insertUsing(object, new DefaultDynamicNameStrategy());
}

... }

huayanYu commented 4 months ago

你需要百度AOP常见失效原因,谁教的AOP可以这么用