[spring] @Value를 사용하는 Spring Expression Language (SpEL) : 달러 대 해시 ($ 대 #)

${...}비해 언제 사용할 지에 대해 약간 혼란 스럽 습니다 #{...}. Spring의 문서는. 만 사용 #{...}하지만 ${...}. 또한 SpEL로 시작했을 때 사용하라는 지시를 받았으며 ${...}제대로 작동합니다.

헷갈리는 분들을 위해 제가 사용하는 방법의 예는

@Component
public class ProxyConfiguration {

    @Value("${proxy.host}")
    private String host;
    @Value("${proxy.port}")
    private String port;

    :
}

및 일부 속성 파일 :

proxy.host=myproxy.host
proxy.port=8000

내 질문은 다음과 같습니다.

  • 차이점은 무엇입니까 아니면 동일합니까?
  • 한 버전이 더 이상 사용되지 않으므로 다른 버전을 사용해야합니까?


답변

${...}속성 자리 표시 자 구문입니다. 속성을 역 참조하는 데만 사용할 수 있습니다.

#{...}SpEL을 구 훨씬 더 유능하고 복잡하다. 또한 속성 자리 표시 자 등을 처리 할 수 ​​있습니다.

둘 다 유효하며 둘 다 더 이상 사용되지 않습니다.


답변

${expr} -> 즉각적인 평가

#{expr} -> 지연된 평가

즉시 평가는 표현식이 평가되고 페이지가 처음 렌더링되는 즉시 결과가 반환됨을 의미합니다. 지연된 평가는 표현 언어를 사용하는 기술이 자신의 기계를 사용하여 적절한시기에 페이지 수명주기 동안 언젠가 표현을 평가할 수 있음을 의미합니다.

여기에서 전체 참조

JSP EL이없고 JSP는 SpEL을 사용합니다. SpEL은 그것을 사용하는 기술에 적합합니다.


답변

읽어보십시오 이 문서 제안,

“해시를 사용하면 해당 요소가 부분 새로 고침에 포함될 때마다 (즉, 렌더링 될 때마다) 코드가 다시 계산됩니다. 달러를 사용하면 페이지가 처음로드 될 때만 코드가 계산됩니다. 그러나 이것은 EL뿐만 아니라 SSJS까지 확장되었습니다. 해시 또는 달러 뒤의 중괄호는 언어의 시작과 끝을 나타냅니다. 나중에 언어를 결합 할 때 중요합니다. “


답변

Expression Language 사양 • 최종 릴리스-2006 년 5 월 8 일

2 쪽:

eval-expression은 $ {expr} 또는 # {expr} 구문을 사용하여 형성됩니다. 두 구조 모두 EL을 사용하는 기술에서 다른 의미를 가질 수 있지만 EL에 의해 정확히 동일한 방식으로 구문 분석되고 평가됩니다.


답변