Ngôn ngữ biểu hiện mùa xuân (SpEL) với @Value: đô la so với hàm băm ($ so với #)


126

Tôi hơi bối rối khi sử dụng ${...}so với #{...}. Tài liệu của Spring chỉ sử dụng #{...}, nhưng có rất nhiều ví dụ sử dụng ${...}. Hơn nữa, khi tôi bắt đầu với SpEL, tôi được yêu cầu sử dụng ${...}và nó hoạt động tốt.

Đối với những người bối rối, một ví dụ về cách tôi sử dụng nó sẽ là

@Component
public class ProxyConfiguration {

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

    :
}

và một số tập tin tài sản:

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

Câu hỏi của tôi là:

  • sự khác biệt là gì hay nó giống nhau?
  • Là một phiên bản không dùng nữa nên tôi nên sử dụng phiên bản kia?

Câu trả lời:


139

${...}là cú pháp giữ chỗ tài sản. Nó chỉ có thể được sử dụng cho các thuộc tính quy định.

#{...}cú pháp SpEL , có khả năng và phức tạp hơn nhiều. Nó cũng có thể xử lý giữ chỗ tài sản, và nhiều hơn nữa bên cạnh.

Cả hai đều hợp lệ, và không được phản đối.


22
Để truy cập thành công các giá trị thuộc tính bằng cú pháp SpEL, hãy sử dụng định dạng"#{'${property}'}"
Brice Roncace

1
Re: bình luận ở trên - cũng thấy câu trả lời này
Steve Chambers

8

${expr} -> Đánh giá ngay lập tức

#{expr} -> Đánh giá hoãn lại

Đánh giá ngay lập tức có nghĩa là biểu thức được ước tính và kết quả được trả về ngay khi trang được hiển thị lần đầu tiên. Đánh giá hoãn lại có nghĩa là công nghệ sử dụng ngôn ngữ biểu thức có thể sử dụng máy móc của chính nó để đánh giá biểu thức sau đó trong suốt vòng đời của trang, bất cứ khi nào phù hợp để làm như vậy.

Tham khảo đầy đủ tại đây

Không có EL EL, JSP sử dụng SpEL. SpEL phù hợp với công nghệ đang sử dụng nó.


6
Bạn đang nói về công nghệ web Java EE trong khi câu hỏi là về cấu hình mùa xuân bằng cách sử dụng Spring ELs. Và sau đó, JSP không sử dụng SpEL, bạn thậm chí không cần Spring để chạy JSP
gregfqt 18/03/2015

3
Tuyên bố cuối cùng về JSP sử dụng SpEL hoàn toàn sai.
Michal M

2
Để làm rõ hơn nữa: JSP kể từ phiên bản 2.1. hỗ trợ tài liệu EL hợp nhất.oracle.com/javaee/5/tutorial/doc/bnahq.html được dùng làm mẫu cho SpEL. Từ tài liệu Spring: "Ngôn ngữ biểu thức mùa xuân (viết tắt là SpEL) là ngôn ngữ biểu thức mạnh mẽ hỗ trợ truy vấn và thao tác biểu đồ đối tượng khi chạy. Cú pháp ngôn ngữ tương tự EL hợp nhất nhưng cung cấp các tính năng bổ sung, đáng chú ý nhất là phương thức và cơ bản chức năng tạo khuôn mẫu chuỗi. "
Fritz Duchardt

-1

Hãy thử đọc bài viết này , trong đó gợi ý

"Nếu hàm băm được sử dụng, mã của bạn được tính toán lại mỗi khi phần tử đó được đưa vào làm mới một phần (tức là mỗi lần nó được hiển thị). Nếu bạn sử dụng một đô la, mã của bạn chỉ được tính khi trang được tải lần đầu. Nhưng điều này đã được mở rộng ra ngoài EL, đến SSJS. Sau khi băm hoặc đô la, dấu ngoặc nhọn biểu thị sự bắt đầu và kết thúc ngôn ngữ của bạn. Điều này sẽ rất quan trọng khi chúng ta kết hợp các ngôn ngữ sau này. "


13
Không ai có liên quan gì đến Spring EL, nó đang nói về JSP EL.
skaffman

@skaffman: mặc dù bạn đúng, tất nhiên, đó là một thông tin thú vị (ít nhất là đối với tôi ...).
sjngm

Một câu trả lời khác nói rằng "không có JSP EL, JSP sử dụng SpEL". Đúng không?
Carl G

1
Có một "Ngôn ngữ biểu thức" (EL) trong đặc tả Java EE, nghĩa là được sử dụng trong các tệp JSP và bởi JSF. Nó không có gì để làm với Spring EL.
gregfqt

-4

Đặc tả ngôn ngữ biểu thức • Bản phát hành cuối cùng - ngày 8 tháng 5 năm 2006

Trang 2:

Một biểu thức eval được hình thành bằng cách sử dụng các cấu trúc $ {expr} hoặc # {expr}. Cả hai cấu trúc đều được phân tích cú pháp và đánh giá chính xác theo cùng một cách bởi EL, mặc dù chúng có thể mang những ý nghĩa khác nhau trong công nghệ sử dụng EL.


2
Phần nào trong câu hỏi của tôi là câu trả lời này? Đó là từ năm 2006 và những từ như "được phân tích và đánh giá theo cùng một cách chính xác" và "có thể mang những ý nghĩa khác nhau" có lẽ mơ hồ là bạn có thể đặt nó.
sjngm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.