Spring EL小記(一)


import java.lang.reflect.Method;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.ParserContext;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
public class StudySpEL {
    
    
    public static void main(String[] args) {
        getStart();
        parseContext();
        regFunction();
    }
    
    public static void getStart() 
    {
        //       ,            ,            
        //         ,       toParseString      
        //"welcome to el world + #name"  ,      ,   
        //               ,               
        final String toParseString = "'welcome to el world' + #name";
        
        //   ,spring        SpelExpressionParser   
        ExpressionParser parser = new SpelExpressionParser();
        
        //                  Expression 
        //Expression       AST  ,  :"'welcome to el world' + #name"   
        //     welcome to el wolrd #name     ,   EvaluationContext  
        Expression expression = parser.parseExpression(toParseString);
        
        //EvaluationContext        ,    Expression        
        //             (   )  name     everybody
        EvaluationContext context = new StandardEvaluationContext();
        context.setVariable("name", "everybody");
        
        Object result = expression.getValue(context);
        System.out.println(result);
        
    }
    
    /**
     *  spring       @Value("#{T(Math).PI * 4^2}")      
     *           #{}     ,   ,spring            
     * ParserContext            ParserContext.TEMPLATE_EXPRESSION
     *      #{   }      ,         ParserContext  
     */
    public static void parseContext()
    {
        //SpEL   + - * / ^ %    
        //SpEL             java.lang              
        //T(Math).PI     java.lang.Math      PI
        final String toParseString = "#{T(Math).PI * 4^2}";
        ExpressionParser parser = new SpelExpressionParser();
        
        //         #{}         ParserContext   ,ParserContext.TEMPLATE_EXPRESSION
        Expression expression = parser.parseExpression(toParseString, ParserContext.TEMPLATE_EXPRESSION);
        Object value = expression.getValue(); //PI*16
        System.out.println(value);
    }
    
    /**
     * SpEL       ,       
     */
    public static void  regFunction()
    {
        final String toParseString = "#customerFunction(4,6)";
        ExpressionParser parser = new SpelExpressionParser();
        Expression expression = parser.parseExpression(toParseString);
        
        StandardEvaluationContext context = new StandardEvaluationContext();
        Method customerFuction = null;
        try {
             customerFuction = StudySpEL.class.getDeclaredMethod("customerFunction", int.class,int.class);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        }
        //StandardEvaluationContext   registerFunction  ,     setVariable
        //    
        context.registerFunction("customerFunction", customerFuction);
        Integer value = expression.getValue(context, int.class);
        System.out.println(value);
        
    }
    
    public static int customerFunction(int a,int b)
    {
        return a+b;
    }
}
      私たちは普段はあまり複雑な表現を使わないかもしれませんが、mybatisのMapperファイルというレベルのものを解析したいです.しかし、注解には表現を使うことができます.だから、少しのspringを知っているELはいつも悪くないです.