同个类中的方法相互调用【例如service
类】,会导致@Cacheable
失效;
原因:调用同个类的方法相当于A方法里面的代码写到B方法中,绕过了代理对象;
解决:可以使用代理对象调用方法解决这个问题;
-
引入aop依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
-
启动类开启
aspectj
动态代理功能,对外暴露代理对象以后所有的动态代理都是
aspectj
创建(即使没有接口也可以创建动态代理)@Slf4j @EnableDiscoveryClient //启动类开启aspectj 动态代理功能,对外暴露代理对象 @EnableAspectJAutoProxy(exposeProxy = true) @SpringBootApplication public class BlogClientApplication { public static void main(String[] args) { log.info("blog client start success."); SpringApplication.run(BlogClientApplication.class, args); } //开启均衡负载能力 @LoadBalanced @Bean public RestTemplate restTemplate() { return new RestTemplate(); } }
-
本类方法互调调用
@Service public class ArticleServiceImpl implements ArticleService { @Override public ArticleDto selectById(String id) { ArticleServiceImpl articleService = (ArticleServiceImpl) AopContext.currentProxy(); ArticleDto articleDto = articleService.selectByIdToCache(id); // 其他业务逻辑 return articleDto; } /** * 查询文章信息 * @author fangzf * RedisKey.ARTICLE_KEY: 自定义redis key常量 */ @Cacheable(value={RedisKey.ARTICLE_KEY}, key = "#id") public ArticleDto selectByIdToCache(String id) { ArticleDto articleDto = new ArticleDto(); // 查询逻辑 return articleDto; } }
举一反三
@Transactional
同样也会出现类是上面失效的问题,同样的原因,还是绕过了代理对象,解决手法类似。
关于@Transactional失效场景
的问题,博主了做了总结,可以打开链接进行食用😊。