스프링 EL이란?
스프링 프로젝트 전반에 걸쳐 필요로 하다보니까, Unified EL 에 메소드 호출 기능과, 문자열 템플릿 기능을 추가하여 스프링이 SpEL을 개발하게 된것이다.
- 객체 그래프를 조회하고 조작하는 기능을 제공한다.
-
Unified EL과 비슷하지만, 메소드 호출을 지원하며, 문자열 템플릿 기능도 제공한다.
-
OGNL, MVEL, JBOss EL 등 자바에서 사용할 수 있는 여러 EL이 있지만, SpEL은
모든 스프링 프로젝트 전반에 걸쳐 사용할 EL로 만들었다.
-
스프링 3.0 부터 지원.
SpEL 구성
ExpressionParser expressionParser = new SpelExpressionParser();
Expression expression = expressionParser.parseExpression("2 + 100");//이 자체가 Expression 이기 때문에 #{"!!이 부분만 넣어주면 됨!!"}
Integer value = expression.getValue(Integer.class);//Spring Expression Language도 이때 Conversion Service 를 사용하게 된다.
System.out.println(value); //int 값이 찍히게 된다. (102)
-
ExpressionParser parser = new SpelExpressionParser()
-
StandardEvaluationContext context = new StandardEvaluationContext(bean)
-
Expression expression = parser.parseExpression(“SpEL 표현식”) // 이미 자체가 expression이라서 #{ }가 들어있다.
-
String value = expression.getvalue(context, String.class)
SpEL은 내부적으로 ExpressionParser 객체를 통해 SpEL의 표현식을 파싱하며 StandardEvaluationContext 객체를 통해 스프링 빈이 가지고 있는 객체 정보를 구한다. 이 두 정보를 가지고 표현식 객체와 객체의 정보를 가지고 SpEL의 표현식 값을 결정한다.
문법
-
#{“표현식"}
-
${“프로퍼티"}
-
표현식은 프로퍼티를 가질수 있지만, 반대는 안됨.
-
#{${my.data} + 1}
-
-
@Component
public class AppRunner implements ApplicationRunner {
/*
문법은 총 두가지가 있다.
조건식 사용과 프로퍼티 참고
@Value("#{조건식}")
@Value("${프로퍼티}")
조건식에 프로퍼티를 넣을순 있다.
("#{${my.value} + 1}") 이런식으로(대신 반대로는 안됨)
*/
@Value("#{1 + 1}") // 1+1 연산
int value;
@Value("#{1 eq 1}") //1 = 1 equals 연산
Boolean istrueOrfalse;
@Value("#{'hello' + 'world'}") //string
String greeting;
@Value("hello") //그냥 문자열을 넣어도 가능.
String hello;
@Value("${my.value}") //프로퍼티 참고하는 방법
int myvalue;
@Value("#{${my.value} eq 100}")
boolean ismyValue100;
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println(value);
System.out.println(istrueOrfalse);
System.out.println(greeting);
System.out.println(hello);
System.out.println(myvalue);
System.out.println(ismyValue100);
}
}
resource > application.properties 에 my.value = 100 추가.
my.value = 100
======================================================================================================
출력 결과
2
true
helloworld
hello
100
true
실제로 어디서 쓰나?
-
@Value 애노테이션
-
@ConditionalOnExpression 애노테이션
-
스프링 시큐리티
-
메소드 시큐리티, @PreAuthorize, @PostAuthorize, @PreFilter, @PostFilter
-
XML 인터셉터 URL 설정
-
...
-
-
스프링 데이터
-
@Query 애노테이션
-
- Thymeleaf
- ...