多数据源调试的问题 + Aop表达式

方法注解与类注解

多数据源AbstractRoutingDataSource集成要点

  • 注解:针对于类与方法 (作用于service层)
  • Aop的拦截器:通过拦截service类下所有的方法都进行拦截操作 表达式:
@Pointcut("execution(* com.ma.service.*.impl..*.*(..))")
  • 方法注解的使用 : @Pointcut(value = “@annotation(com.ma.annotion.DynamicSource)”)
  • 类注解的使用 : @Pointcut(“execution(* com.ma.service..impl….*(…))”) 扫描某个包下面的
  • 注意点 : 切换数据源的类加上注解还有一点的是实现全部的方法才可以有效的动态切换数据源否则注解无效
@Service
@DynamicSource("temp")
public class SubCustomersPrizeServiceImpl extends BaseCoreServiceImpl<SubCustomersPrizesMapper, SubCustomersPrizes> implements SubCustomersPrizeService {

    @Override
    public int count(BaseExample example) {
        return super.count(example);
    }
}    
  • 类注解的原因:经过测试 不写实现方法,注解监听就到父类的实现上,就会先切换数据源然后再设置threadlocal的值 。正确的流程则是:先设置threadlocal值再切换数据源的操作
  • 待完善的地方:注解类要达到可以不写代码内容值 【很重要】
  • 测试的地方,使用切换数据源的地方尽量不要使用 @Transactional 【带有这个注解会影响到事务的order值,它会默认设置为1的】
  • 思考下是否是因为注解的原因导致多数据源的测试的误差问题
@within 类上与其方法  @annotation 只作用于方法上

父类有注解,但子类没有注解的话,@within和@target是不会对子类生效的。
子类没有注解的情况下,只有没有被重写的有注解的父类的方法才能被@within匹配到。
如果父类无注解,子类有注解的话,@target对父类所有方法生效,@within只对重载过的方法生效。

表达式


    /**
     * 一、execution(方法表达式)
     * 1、匹配方法时,只能匹配到实现类,匹配到接口类不能成功
     * 2、匹配方法执行
     */
    // 匹配cn.timebusker.service包及子包下的任何方法执行
    @Pointcut(value = "execution(* cn.timebusker.service.*.*(..))")
    public void log1() {
    }

    // 匹配任何包下的service包及子包下的任何方法执行(该模式只能匹配到一级的子包,多级子包不适用)
    @Pointcut(value = "execution(* *..service.*.*(..))")
    public void log2() {
    }

    // 匹配任何包下的service包及子包下的任何方法执行(该模式能匹配到任何多级的子包下的方法执行)
    @Pointcut(value = "execution(* *..service..*(..))")
    public void log3() {
    }

    // 匹配返回值类型为java.lang.String的任何包下的service包及子包下的方法执行
    @Pointcut(value = "execution(java.lang.String *..service..*(..))")
    public void log4() {
    }

    // 匹配返回值类型为int的任何包下的service包及子包下的方法执行
    @Pointcut(value = "execution(int *..service..*(..))")
    public void log5() {
    }

    // 匹配任何返回值类型的cn.timebusker包及任何子包下的以add开头的参数为Strign类型的方法执行
    @Pointcut(value = "execution(* cn.timebusker..add*(String))")
    public void log6() {
    }

    // 匹配 OR、AND
    @Pointcut(value = "execution(* cn.timebusker.service.*.add*(int))")
    public void log7() {
    }

    // 匹配 OR、AND、
    @Pointcut(value = "execution(* cn.timebusker.service.*.add*(int)) OR execution(* cn.timebusker..add*(String))")
    public void log8() {
    }

    /**
     * 二、within(类型表达式)
     * 1、匹配类型时,只能匹配到实现类,匹配到接口类不能成功
     * 2、匹配指定类型内的方法执行;
     */
    // 匹配指定类型内的方法执行--只能匹配类型
    @Pointcut(value = "within(cn.timebusker.service.order.Impl.OrderInfoServiceImpl)")
    public void logw1() {
    }

    // 匹配指定类型内的方法执行(包下所有的类)
    @Pointcut(value = "within(cn.timebusker.service.order.Impl.*)")
    public void logw2() {
    }

    /**
     * 三、this(类型全限定名)
     * 1、可以直接匹配接口类型完成  类型全名限定匹配
     * 2、注意是AOP代理对象的类型匹配,这样就可能包括引入接口方法也可以匹配;注意this中使用的表达式必须是类型全限定名,不支持通配符
     */
    // 匹配指定类型内的方法执行(包下所有的类)
    @Pointcut(value = "this(cn.timebusker.service.order.OrderInfoService)")
    public void logt1() {
    }

    /**
     * 四、target(类型全限定名)--匹配当前目标对象类型的执行方法
     * 1、可以直接匹配接口类型完成  类型全名限定匹配
     * 2、注意是目标对象的类型匹配,这样就不包括引入接口也类型匹配;注意target中使用的表达式必须是类型全限定名,不支持通配符
     */
    // 匹配指定类型内的方法执行(包下所有的类)
    @Pointcut(value = "target(cn.timebusker.service.order.OrderInfoService)")
    public void logt2() {
    }

/**
 * 五、args(参数类型列表)--匹配当前执行的方法传入的参数为指定类型的执行方法
 * 1、注意是匹配传入的参数类型,不是匹配方法签名的参数类型;参数类型列表中的参数必须是类型全限定名,通配符不支持;
 * 2、args属于动态切入点,是在运行时动态匹配的,这种切入点开销非常大,非特殊情况最好不要使用;
 * 3、此处不作示例
 */

    /**
     * 六、@within(注解类型)--匹配所以持有指定注解类型内的方法;注解类型也必须是全限定类型名;
     * 1、注解类型也必须是全限定类型名;
     */
    // 匹配被org.springframework.stereotype.Service这个注解标注的类----注解标注在接口上不起作用
    @Pointcut(value = "@within(org.springframework.stereotype.Service)")
    public void logaw1() {
    }

    // 匹配 自定义注解标注的类----注解标注在接口上不起作用
    @Pointcut(value = "@within(cn.timebusker.annotation.timebuskerBean)")
    public void logaw2() {
    }

/**
 * 七、@target(注解类型)--匹配当前目标对象类型的执行方法
 * 1、目标对象持有指定的注解;
 * 2、注解类型也必须是全限定类型名;
 * 3、此处不作示例
 */

    /**
     * 八、@annotation(注解类型)--匹配当前执行方法持有指定注解的方法
     * 1、注解类型也必须是全限定类型名;
     */
    // 匹配 自定义注解标注的类----注解标注在接口的方法上不起作用
    @Pointcut(value = "@annotation(cn.timebusker.annotation.timebuskerMethod)")
    public void logaa1() {
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值