自定义Spring缓存注解中,属性赋值时使用SpringEL获取入参信息不起作用

fgod 发布于 2016/11/08 15:12
阅读 4K+
收藏 0

【深圳】源创会:5.26下午、轰趴馆等你”

我在做一个自定义的缓存注解策略,比如要在新增、修改的操作时,使用自定义注解更灵活的去清除指定的缓存:

spring自己的CacheEvict中key="#user.id" 是能起作用的,在Cacheable..中去使用spel都可以获取入参的信息

但是我自己定义的注解MyCacheEvict里,在属性中一样的表达式去获取方法入参信息却拿不到值。

是需要额外加入什么配置才能使用springEL吗?跪求各位大神解惑!!

service方法截图:

import org.springframework.cache.annotation.CacheEvict;
  import com.example.common.cacheCustomer.MyCacheEvict;
@CacheEvict(value = "users",key = "'user_'.concat(#user.id)")
    @MyCacheEvict(value = "users",key ="'user_'.concat(#user.id)",  keys = {"#{user.id}", "list"}, keyRegex = "list")
//    spel: #user.id  或者 #user.getId()
    public int updateOne(Users user){
        return userMapper.updateByPrimaryKeySelective(user);
    }

自定义注解:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Component
@Documented
public @interface MyCacheEvict {
//    设置default 值,则属性为非必填项
    String value();//cacheName
    String key() default "";//key
    String[] keys() default {};//key数组
    String keyRegex() default "";//key 模糊匹配
    boolean allEntries() default false;//是否清除此cache下所有缓存
}

aop配置缓存策略:


@Aspect//声明一个切面
@Component//让此切面成为受Spring容器管理的Bean
public class CacheAspect {
       @Pointcut("@annotation(com.example.common.cacheCustomer.MyCacheEvict)")
       //声明切点
       public void annotationPointCut(){};
       @Autowired
       CacheManager cacheManager;

       @After("annotationPointCut()")
       public void after(JoinPoint joinpoint){
           MethodSignature signature = (MethodSignature) joinpoint.getSignature();
           Method method = signature.getMethod();
           MyCacheEvict myCacheEvict = method.getAnnotation(MyCacheEvict.class);
           //反射得到注解上的属性
           String value = myCacheEvict.value();
           String key = myCacheEvict.key();
           String regex = myCacheEvict.keyRegex();
           String[] keys = myCacheEvict.keys();
           boolean allEntries = myCacheEvict.allEntries();
           System.out.println("注解式缓存策略---"+value+"-"+key);//
           Cache cache = cacheManager.getCache(value);
           Element element = cache.get(key);
           System.out.println(element);
       }
       @Before("annotationPointCut()")
       public void before(JoinPoint joinpoint){

       }

}






加载中
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部