티스토리 뷰

  • Spring SpEL (Expression Language)은 runtime에 object graph를 query하고 조작하는 강력한 표현언어이다.
  • SpEL 문법은 EL(Unified EL)과 비슷하지만, 메서드 호출과 기본 문자열 템플릿 기능 등 추가적인 기능을 제공한다. 
  • OGNL, MVEL, JBoss EL 등의 여러가지 자바 표현언어가 존재하지만 스프링 표현언어는 스프링 포트폴리오의 모든 제품에 걸쳐서 사용할 수 있는 하나의 표현언어를 스프링 커뮤니티에 제공하기 위해서 만들어졌다. 
  • SpEL은 기술에 독립적인 API를 기반으로하며 필요에 따라 다른 표현 언어 구현을 통합 할 수 있다. 
  • SpEL은 Spring 포트폴리오 내에서 식 평가의 기초로 사용되지만 Spring과 직접 관련이 없으며 독립적으로 사용할 수 있습니다. 

Examples:

 

smaple class

public class Inventor {
    private String name;
    private String nationality;
    private String[] inventions;
    private Date birthdate;
    private PlaceOfBirth placeOfBirth;
}

public class Society {
    private String name;
    private List<Inventor> members;
    private Map<String, Inventor> officers;
}

 

basic

ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("'Hello World'.concat('!')");
String message = (String) exp.getValue();

>> Hello World!

object

// The Inventor constructor arguments are name, nationality.
Inventor tesla = new Inventor("Nikola Tesla", "Serbian");

ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("name");
String name = (String) exp.getValue(tesla);

>> Nikola Tesla

boolean

Expression exp = parser.parseExpression("name == 'Nikola Tesla'");
boolean result = exp.getValue(context, Boolean.class);

>> true

list

StandardEvaluationContext teslaContext = new StandardEvaluationContext(tesla);
String invention = parser.parseExpression("inventions[0]").getValue(teslaContext, String.class);

selection (** filed명의 첫 글자를 대문자로 사용한다.)

StandardEvaluationContext societyContext = new StandardEvaluationContext(ieee);
List<Inventor> list = (List<Inventor>) parser.parseExpression("Members.?[Nationality == 'Serbian']").getValue(societyContext);

map

Society ieee = new Society();

StandardEvaluationContext societyContext = new StandardEvaluationContext(ieee);

Inventor pupin = parser.parseExpression("Officers['president']").getValue(societyContext, Inventor.class);

String city = parser.parseExpression("Officers['president'].PlaceOfBirth.City").getValue(societyContext, String.class);

type

Class stringClass = parser.parseExpression("T(String)").getValue(Class.class);

Class dateClass = parser.parseExpression("T(java.util.Date)").getValue(Class.class);

variables

#this and #root variables

List<Integer> primes = new ArrayList<Integer>();
primes.addAll(Arrays.asList(2,3,5,7,11,13,17));

// create parser and set variable primes as the array of integers
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext();
context.setVariable("primes",primes);

// all prime numbers > 10 from the list (using selection ?{...})
// evaluates to [11, 13, 17]
List<Integer> primesGreaterThanTen = (List<Integer>) parser.parseExpression("#primes.?[#this>10]").getValue(context);

function

//function class
public class StringUtils {

    public static String reverseString(String input) {
        StringBuilder backwards = new StringBuilder();
        for (int i = 0; i < input.length(); i++)
            backwards.append(input.charAt(input.length() - 1 - i));
        }
        return backwards.toString();
    }
}

//register function
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext();

context.registerFunction("reverseString", StringUtils.class.getDeclaredMethod("reverseString", new Class[] { String.class }));

String helloWorldReversed = parser.parseExpression("#reverseString('hello')").getValue(context, String.class);

elvis operator

//elvis operator: 삼항연잔자의 단축버전.
//Objects.isNull(someObject) ? defaultValue : inputValue
String name = parser.parseExpression("null?:'Unknown'").getValue(String.class);

templating

String randomPhrase = parser.parseExpression(
 	"random number is #{T(java.lang.Math).random()}",
    new TemplateParserContext()
).getValue(String.class);

>> "random number is 0.7038186818312008"

 

참고

- https://docs.spring.io/spring/docs/4.1.x/spring-framework-reference/html/expressions.html

'Programming > Spring' 카테고리의 다른 글

@Order 사용시 주의점  (0) 2021.02.08
Spring Properties  (0) 2020.05.02
JDBC Template Query Logging  (0) 2019.08.02
RetryTemplate  (0) 2019.07.24
[주의] Controller Parameter Mapping Exception  (0) 2019.07.09
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함