alibaba / jetcache

JetCache is a Java cache framework.
Apache License 2.0
5.03k stars 1.05k forks source link

我觉得com.alicp.jetcache.anno.config.JetCacheProxyConfiguration中CacheAdvisor的Bean中setAdviceBeanName的名字可能设置错了 #845

Closed xiongmaodeguxiang closed 8 months ago

xiongmaodeguxiang commented 8 months ago

CacheAdvisor继承了AbstractBeanFactoryPointcutAdvisor类,而类中有如下代码: ` Advice advice = this.advice; if (advice != null) { return advice; }

    Assert.state(this.adviceBeanName != null, "'adviceBeanName' must be specified");
    Assert.state(this.beanFactory != null, "BeanFactory must be set to resolve 'adviceBeanName'");

    if (this.beanFactory.isSingleton(this.adviceBeanName)) {
        // Rely on singleton semantics provided by the factory.
        advice = this.beanFactory.getBean(this.adviceBeanName, Advice.class);
        this.advice = advice;
        return advice;
    }`

我认为adviceBeanName的本意是如果CacheAdvisor没有设置advice时会查找容器中名为adviceBeanName的bean作为Advice,但是坐着指定的名字advisor.setAdviceBeanName(CacheAdvisor.CACHE_ADVISOR_BEAN_NAME); 这个CACHE_ADVISOR_BEAN_NAME是CacheAdvisor的名字。 因为作者指定了Advie所以设置adviceBeanName是啥已经不重要了,但是这块代码中的写一个错的名字还是有些不舒服,不知道作者有没有兴趣修复一下,嘿嘿

areyouok commented 8 months ago

我没有看懂,哪个名字写错了?

xiongmaodeguxiang commented 8 months ago

我理解advisor.setAdviceBeanName()这个方法中设置的应该是advice的name吧,就是JetCacheInterceptor这个bean的名字

xiongmaodeguxiang commented 8 months ago

当然,您已经执行了advisor.setAdvice(jetCacheInterceptor),所以advice已经不为空了,所谓我理解您再指定adviceBeanName也没有意义了

areyouok commented 8 months ago

这代码好多年了我也不太记得,但我的理解是需要指定一个非默认的名字,否则如果有多个advisor呢?

或者你的意思是advisor.setAdviceBeanName(CacheAdvisor.CACHE_ADVISOR_BEAN_NAME);这一行是多余的?

xiongmaodeguxiang commented 8 months ago

哈哈,大佬,我也是最近在研读学习您的代码,梳理一下逻辑,对您很是敬佩。

  1. 如果多个advisor,某个method是否命中在pointCut中已经判断过滤了,所以存在多个advisor也没有问题,而且每个advisor如果没有指定,Spring会给他们自动生成一个bean名称

2.是的,advisor.setAdviceBeanName(CacheAdvisor.CACHE_ADVISOR_BEAN_NAME);这一行就多余了 因为您的代码中执行了advisor.setAdvice(jetCacheInterceptor); 具体的逻辑在org.springframework.aop.support.AbstractBeanFactoryPointcutAdvisor#getAdvice方法中, 逻辑大概是如果你设置了advice了那么就直接返回advice,如果没有设置,那么它会从spring中获取您指定的adviceBeanName的bean作为advice

不过是个小问题而已,不太影响什么

areyouok commented 8 months ago

那可以把这一行删掉试试单元测试是否还能跑通

xiongmaodeguxiang commented 8 months ago

我把这一行删除后,项目是可以正常跑通的