@Cached 不生效

Spring AOP简介与底层实现机制——动态代理

创建缓存实例
JetCache通过Spring AOP生成代理,来支持缓存功能。

AopContext.currentProxy()该用法的意义
原来在springAOP的用法中,只有代理的类才会被切入,我们在controller层调用service的方法的时候,是可以被切入的,但是如果我们在service层 A方法中,调用B方法,切点切的是B方法,那么这时候是不会切入的,解决办法就是如上所示,在A方法中使用
((Service)AopContext.currentProxy()).B() 来调用B方法,这样一来,就能切入了!

AopContext.currentProxy()的使用
解决方案就是把service的A方法中对B的调用改成代理对象的调用,怎么获取代理对象呢,AopContext.currentProxy()使用ThreadLocal保存了代理对象,因此((Service) AopContext.currentProxy()).B()就能解决。

spring注解方式设置exposeProxy=true

@Cacheable注解不生效

Spring Cache注解无效:可能是类内方法调用注解缓存的方法

// Application.java
@EnableAspectJAutoProxy(exposeProxy = true)
public class Application {
    public static void main(final String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
// PublicService.java
public interface PublicService {
    void publicMethod(String id, String msg);
}

// PrivateService.java
public interface PrivateService {
    String privateMethod();
}
@Service
public class PublicServiceImpl implements PublieService, PrivateService {
    @Override
    @Cached(name = "PrivateMethod", expire = CommonConstant.REMOTE_CACHE_DEFAULT_EXPIRE_SECONDS)
    private String privateMethod(){ return "xxx"; }
    
    public void publicMethod() {
        String str = ((PrivateService) AopContext.currentProxy()).privateMethod();
    }
}

你可能感兴趣的:(@Cached 不生效)