티스토리 뷰
- 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
링크
TAG
- Join Table
- Spring JDBC Template
- scikit-learn
- @Primary
- docker
- 복합키 Mapping
- Registrar
- guava
- Akka
- spring spel
- Embedded Mapping
- JPA Criteria
- DI
- Charles proxy
- Spring Registrar
- java EqualsAndHashCode
- Typesafe Config
- Discriminate Mapping
- Embeddable Mapping
- Criteria
- java Equals
- RetryTemplate
- Mapping
- java generic
- SmartLifecycle
- Query DSL
- Property
- JPA
- Spring
- Sprint RetryTemplate
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
글 보관함