文档章节

Spring EL小记(二)

trayvon
 trayvon
发布于 2016/03/25 08:49
字数 294
阅读 39
收藏 1

首先,写一个简单的缓存注解:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Cache {
    public String key();
    
    public int expire() default 600;
}

假设有一个数据访问的类:

import cn.freemethod.annotation.Cache;
public class DaoService {
   
    @Cache(key="#hash(#args1,#args2)")
    public void getData(String name,int id)
    {
        System.out.println("access data");
    }
}

缓存的工具类 :

import java.lang.reflect.Method;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import cn.freemethod.annotation.Cache;
public class CacheUtil {
    
    public static void dealCacheAnnotation(Class<?> clazz)
    {
        ExpressionParser parser = new SpelExpressionParser();
        StandardEvaluationContext context = new StandardEvaluationContext();
        Method[] methods = clazz.getDeclaredMethods();
        Method[] ms = CacheUtil.class.getDeclaredMethods();
        Method method = null;
        
         for(Method m:ms)
         {
             if("hash".equalsIgnoreCase(m.getName()))
              {
                 method = m;
                 break;
               }
         }
        
        for(Method m:methods)
        {
            if(m.isAnnotationPresent(Cache.class))
            {
                Cache cacheAnnotation = m.getAnnotation(Cache.class);
                String key = cacheAnnotation.key();
                Expression expression = parser.parseExpression(key);
                context.registerFunction("hash", method);
                Class<?>[] parameterTypes = m.getParameterTypes();
                for(int i= 0;i<parameterTypes.length;i++)
                {
                    ////生成key的方法不好,重复太多
                    context.setVariable("args"+(i+1), parameterTypes[i].getName());
                }
                
                String value = expression.getValue(context,String.class);
                System.out.println(value);
                System.out.println(value.length());
            }
        }
    }
    
    public static String hash(String... strings)
    {
        StringBuffer sb = new StringBuffer();
        for(String s:strings)
            sb.append(s);
        String tmp = sb.toString();
        sb = new StringBuffer();
        for(int i=0;i<tmp.length();i++)
            sb.append((int)tmp.charAt(i));
        return sb.substring(0, 20);//sb.toString();
    }
    public static void main(String[] args) {
        dealCacheAnnotation(DaoService.class);
    }
}


© 著作权归作者所有

共有 人打赏支持
trayvon
粉丝 16
博文 129
码字总数 191361
作品 1
程序员
私信 提问
JSP自定义标签扩展----支持EL,访问Spring容器

一、使JSP自定义标签支持EL表达式(${}) 我写了自定义标签a:rim,想让他的title属性支持${},可是出现了异常. 要做下面两件事就可以达到目的了: 1 在tld文件如下配置: 其中关键的是 <rtexprval...

lee123lee
2013/09/28
0
0
Spring/Maven/MyBatis配置文件结合properties文件使用

使用properties文件也叫注入,比如把一些常用的配置项写入到这个文件,然后在Spring的XML配置文件中使用EL表达式去获取。 这种方式不只Spring可以使用,同样MyBatis也可以使用,只不过加载的...

easonjim
2017/06/24
0
0
web调用后台程序spring无法注入问题

架构是这样的 ssh(struts2,spring3.1,hibernate4) action->el->service-dao el模块里有个 线程池 ,我管 线程池 叫 工头 .然后el模块还有个线程类.我管这个 线程类 叫 工人 . 工头从任务队列添...

陈X生
2013/03/03
341
1
Spring Integration 2.0.0.M1 发布

Spring Integration能在基于Spring的应用中进行简单的消息通信,并通过简单的适配器与外部系统集成。这些适配器提供了一个更高级别的抽象,超越 了Spring对远程调用、消息和调度的支持。其主...

红薯
2009/10/14
263
0
使用Spring3.1注解 缓存 模糊匹配Evict的问题

最近用到Spring 3.1的注解cache. 比如说 此时是进行分页的缓存, 表示查询的是blog为id的用户下从firstindex开始一共maxresult条博客文章记录. 但是如果该用户添加或修改了一篇文章 那么这个缓...

就是不着调
2012/05/12
1K
6

没有更多内容

加载失败,请刷新页面

加载更多

Java网络编程

基本概念 网络IO会涉及到同步,异步,阻塞,非阻塞等几个概念。 一个网络IO读取过程是数据从 网卡 到 内核缓冲区 到 用户内存 的过程。同步和异步区别在于数据从内核到用户内存的过程是否需要...

春哥大魔王的博客
24分钟前
1
0
Spring "reg:zookeeper" 的前缀 "reg" 未绑定等类似问题解决方案。

今天同事遇到一个Spring启动加载配置文件时,不识别reg:zookeeper标签的问题。 我查看配置,发现是Spring配置文件的头部没有引入reg标签的命名空间,具体如下图: 所以,以后遇到类似的标签未...

花漾年华
53分钟前
1
0
阿里云领衔云市场

近期,2018年Q4及全年的全球云基础设施服务市场数据新鲜出炉,发布方是美国市场研究机构Synergy Research Group。这个机构是专做电信网络市场情报的公司,成立于1999年,每年都会公布各大公有...

linuxCool
今天
2
0
C++友元函数和友元类(C++ friend)详解

私有成员只能在类的成员函数内部访问,如果想在别处访问对象的私有成员,只能通过类提供的接口(成员函数)间接地进行。这固然能够带来数据隐藏的好处,利于将来程序的扩充,但也会增加程序书...

shzwork
今天
3
0
JAVA对map进行分组

public static Map<String, List<Map<String, Object>>> transition(List<Map<String, Object>> list){ Map<String, List<Map<String, Object>>> map = new HashMap<>(); //......

火龙战士
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部