Spring Expression Language (SpEL) ที่มี @Value: ดอลลาร์เทียบกับแฮช ($ เทียบกับ #)


126

ฉันสับสนเล็กน้อยเกี่ยวกับเวลาที่จะใช้${...}เมื่อเทียบกับ#{...}. เอกสารของฤดูใบไม้ผลิใช้เพียงแต่มีมากมายตัวอย่างว่าการใช้งาน#{...} ${...}นอกจากนี้เมื่อฉันเริ่มใช้ SpEL ฉันได้รับคำสั่งให้ใช้${...}และมันก็ใช้ได้ดี

สำหรับผู้ที่สับสนตัวอย่างของการใช้งานจะเป็นอย่างไร

@Component
public class ProxyConfiguration {

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

    :
}

และไฟล์คุณสมบัติบางอย่าง:

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

คำถามของฉันคือ:

  • อะไรคือความแตกต่างหรือเหมือนกัน?
  • เวอร์ชันหนึ่งเลิกใช้งานแล้วฉันควรใช้เวอร์ชันอื่นหรือไม่

คำตอบ:


140

${...}คือไวยากรณ์ตัวยึดคุณสมบัติ สามารถใช้เพื่อหักล้างคุณสมบัติเท่านั้น

#{...}เป็นไวยากรณ์ SpELซึ่งมีความสามารถและซับซ้อนกว่ามาก นอกจากนี้ยังสามารถจัดการตัวยึดคุณสมบัติและอื่น ๆ อีกมากมาย

ทั้งสองอย่างถูกต้องและไม่มีการเลิกใช้งาน


22
เพื่อให้เข้าถึงค่าคุณสมบัติโดยใช้ไวยากรณ์ SpEL ได้สำเร็จให้ใช้รูปแบบ"#{'${property}'}"
Brice Roncace

1
Re: comment ด้านบน - ดูคำตอบนี้ด้วย
Steve Chambers

8

${expr} -> การประเมินผลทันที

#{expr} -> การประเมินรอตัดบัญชี

การประเมินผลทันทีหมายความว่านิพจน์ได้รับการประเมินและผลลัพธ์จะถูกส่งกลับทันทีที่แสดงผลเพจครั้งแรก การประเมินรอการตัดบัญชีหมายความว่าเทคโนโลยีที่ใช้ภาษานิพจน์สามารถใช้เครื่องจักรของตัวเองเพื่อประเมินนิพจน์ในภายหลังระหว่างวงจรชีวิตของเพจเมื่อใดก็ตามที่เหมาะสม

อ้างอิงฉบับสมบูรณ์ที่นี่

ไม่มี JSP EL, JSP ใช้ SpEL SpEL เหมาะกับเทคโนโลยีที่ใช้อยู่


6
คุณกำลังพูดถึงเทคโนโลยีเว็บ Java EE ในขณะที่คำถามเกี่ยวกับ Spring config โดยใช้ Spring ELs จากนั้น JSP ไม่ใช้ SpEL คุณไม่จำเป็นต้องใช้ Spring เพื่อรัน JSPs ด้วย
ซ้ำ

3
ข้อความสุดท้ายใน JSP ที่ใช้ SpEL นั้นผิดทั้งหมด
Michal M

2
เพื่อชี้แจงเพิ่มเติม: JSP ในเวอร์ชัน 2.1 รองรับ Unified EL docs.oracle.com/javaee/5/tutorial/doc/bnahq.htmlซึ่งทำหน้าที่เป็นเทมเพลตสำหรับ SpEL จาก Spring docu: "Spring Expression Language (SpEL สำหรับระยะสั้น) เป็นภาษานิพจน์ที่มีประสิทธิภาพซึ่งรองรับการสืบค้นและจัดการกราฟวัตถุในขณะรันไทม์ไวยากรณ์ของภาษาคล้ายกับ Unified EL แต่มีคุณสมบัติเพิ่มเติมโดยเฉพาะอย่างยิ่งวิธีการเรียกใช้และพื้นฐาน ฟังก์ชันการสร้างเทมเพลตสตริง "
Fritz Duchardt

-1

ลองอ่านบทความนี้ซึ่งแนะนำ

"หากมีการใช้แฮชโค้ดของคุณจะถูกคำนวณใหม่ทุกครั้งที่องค์ประกอบนั้นรวมอยู่ในการรีเฟรชบางส่วน (กล่าวคือทุกครั้งที่มีการแสดงผล) หากคุณใช้เงินดอลลาร์รหัสของคุณจะคำนวณเมื่อโหลดหน้าแรกเท่านั้น แต่นี่ ได้ถูกขยายออกไปมากกว่าแค่ EL ไปจนถึง SSJS ด้วยหลังจากแฮชหรือดอลลาร์วงเล็บปีกกาจะแสดงจุดเริ่มต้นและจุดสิ้นสุดของภาษาของคุณสิ่งนี้จะมีความสำคัญเมื่อเรามารวมภาษาในภายหลัง "


13
ไม่มีส่วนเกี่ยวข้องใด ๆ กับ Spring EL แต่เป็นการพูดถึง JSP EL
skaffman

@skaffman: แม้ว่าคุณจะพูดถูก แต่ก็เป็นข้อมูลที่น่าสนใจ (อย่างน้อยสำหรับฉัน ... )
sjngm

อีกคำตอบหนึ่งบอกว่า "ไม่มี JSP EL, JSP ใช้ SpEL" ถูกต้องหรือไม่
Carl G

1
มี "Expression Language" (EL) ในข้อมูลจำเพาะ Java EE ซึ่งใช้ใน JSPs และโดย JSF มันไม่มีส่วนเกี่ยวข้องกับ Spring EL
gregfqt

-4

ข้อกำหนดภาษานิพจน์•รุ่นสุดท้าย - 8 พฤษภาคม 2549

หน้าที่ 2:

นิพจน์ eval ถูกสร้างขึ้นโดยใช้โครงสร้าง $ {expr} หรือ # {expr} โครงสร้างทั้งสองได้รับการแยกวิเคราะห์และประเมินด้วยวิธีเดียวกันโดย EL แม้ว่าจะมีความหมายที่แตกต่างกันในเทคโนโลยีที่ใช้ EL


2
คำถามนี้ควรตอบส่วนไหนของฉัน มาจากปี 2006 และคำอย่าง "แยกวิเคราะห์และประเมินในลักษณะเดียวกัน" และ "อาจมีความหมายต่างกัน" อาจจะคลุมเครืออย่างที่คุณสามารถใส่ได้
sjngm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.