https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/expressions.html
스프링 어노테이션을 통해 값을 전달하는 방법입니다.
SpEL 사용법
SpEL 표현식은 다음과 같은 규칙이 있습니다.
- # 기호로 시작하고 중괄호로 묶는다. ex) #{expression}
- 속성은 $ 기호로 시작하고 중괄호로 감싼다. ex) ${property.name}
스프링에서 SpEL이 자주 사용되는 어노테이션은 대략 다음과 같은 어노테이션들이 있습니다.
- @Value
- @PreAuthorize
- @PostAuthorize
- @PreFilter
- @PostFilter
표현식은 다음과 같이 사용할 수 있습니다.
@Value("#{19 + 1}") // 20
private double add;
@Value("#{'String1 ' + 'string2'}") // "String1 string2"
private String addString;
@Value("#{1 == 1}") // true
private boolean equal;
@Value("#{250 > 200 && 200 < 4000}") // true
private boolean and;
@Value("#{2 > 1 ? 'a' : 'b'}") // "a"
private String ternary;
@Value("#{'100' matches '\\d+' }") // true
private boolean validNumericStringResult;
@Value(#{systemProperties['priority'] ?: 'some default'})
private String priority;
...
SpEL 파싱
SpEL을 활용하여 파싱하고 표현 방식을 기준으로 결과로 변환할 수있습니다.
단순히 값을 지정하는 것이 아닌 표현 규칙에 맞게 변환된 값을 뽑아낼 수 있습니다.
ExpressionParser.class
ExpressionParser 는 문자열 표현을 파싱하는 책임을 가지고 Expression 는 문자열 표현의 평가를 책임집니다.
ExpressionParser, Expression 클래스를 이용하면 다음과 같이 SpEL을 파싱할 수 있습니다.
ExpressionParser expressionParser = new SpelExpressionParser();
Expression expression = expressionParser.parseExpression("'Any string'");
String result = (String) expression.getValue(); // "Any string"
Expression expression = expressionParser.parseExpression("'Any string'.length()");
Integer result = (Integer) expression.getValue(); // 10
EvaluationContext.class
EvaluationContext 는 프로퍼티, 메서드, 필드를 확인하고 타입 변환을 수행하는 표현식을 평가할 때 사용됩니다.
EvaluationContext 는 다음 두가지 구현체를 제공합니다.
- SimpleEvaluationContext
- SpEL의 전체 범위가 필요하지 않으며 의미 있게 제한되어야 할 때 사용
- 자바 타입 참조, 생성자 및 bean 참조를 지원하지 않음
- StandardEvaluationContext
- 리플렉션을 기반으로 SpEL의 모든 기능 제공
Car car = new Car();
car.setMake("Good manufacturer");
car.setModel("Model 3");
ExpressionParser expressionParser = new SpelExpressionParser();
Expression expression = expressionParser.parseExpression("model");
EvaluationContext context = new StandardEvaluationContext(car);
String result = (String) expression.getValue(context); // "Model 3"