Spring Expression Language (SpEL) dengan @Value: dollar vs. hash ($ vs. #)

126

Saya agak bingung kapan harus menggunakan ${...}dibandingkan #{...}. Dokumentasi Spring hanya menggunakan #{...}, tetapi ada banyak contoh yang digunakan ${...}. Selanjutnya, ketika saya mulai dengan SpEL saya diberitahu untuk menggunakan ${...}dan itu berfungsi dengan baik.

Bagi yang bingung, contoh bagaimana saya menggunakannya

@Component
public class ProxyConfiguration {

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

    :
}

dan beberapa file properti:

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

Pertanyaan saya adalah:

  • apa perbedaannya atau sama?
  • apakah satu versi sudah usang, jadi saya harus menggunakan yang lain?
sjngm
sumber

Jawaban:

140

${...}adalah sintaks placeholder properti. Ini hanya dapat digunakan untuk properti dereferensi.

#{...}adalah sintaks SpEL , yang jauh lebih mampu dan kompleks. Itu juga dapat menangani placeholder properti, dan banyak lagi lainnya.

Keduanya valid, dan tidak ada yang tidak digunakan lagi.

skaffman
sumber
22
Untuk berhasil mengakses nilai properti menggunakan sintaks SpEL, gunakan format"#{'${property}'}"
Brice Roncace
1
Re: komentar di atas - lihat juga jawaban ini
Steve Chambers
8

${expr} -> Evaluasi Segera

#{expr} -> Evaluasi yang Ditunda

Evaluasi langsung berarti ekspresi dievaluasi dan hasilnya dikembalikan segera setelah halaman pertama kali dirender. Evaluasi yang ditangguhkan berarti bahwa teknologi yang menggunakan bahasa ekspresi dapat menggunakan mesinnya sendiri untuk mengevaluasi ekspresi tersebut beberapa saat kemudian selama siklus hidup halaman, kapan pun memungkinkan.

Referensi lengkapnya disini

Tidak ada JSP EL, JSP menggunakan SpEL. SpEL cocok dengan teknologi yang menggunakannya.

XvrCJ
sumber
6
Anda sedang berbicara tentang teknologi web Java EE sedangkan pertanyaannya adalah tentang konfigurasi pegas menggunakan Spring ELs. Dan kemudian, JSP tidak menggunakan SpEL, Anda bahkan tidak perlu Spring untuk menjalankan
JSPs
3
Pernyataan terakhir di JSP yang menggunakan SpEL sepenuhnya salah.
Michal M
2
Untuk memperjelas lebih jauh: JSP pada versi 2.1. mendukung Unified EL docs.oracle.com/javaee/5/tutorial/doc/bnahq.html yang berfungsi sebagai template untuk SpEL. From the Spring docu: "Spring Expression Language (singkatnya SpEL) adalah bahasa ekspresi yang kuat yang mendukung kueri dan manipulasi grafik objek pada waktu proses. Sintaks bahasanya mirip dengan Unified EL tetapi menawarkan fitur tambahan, terutama pemanggilan metode dan dasar fungsionalitas template string. "
Fritz Duchardt
-1

Coba baca artikel ini , yang menyarankan

"Jika hash digunakan, kode Anda dihitung ulang setiap kali elemen tersebut disertakan dalam penyegaran parsial (yaitu setiap kali dirender). Jika Anda menggunakan dolar, kode Anda hanya dihitung saat halaman pertama kali dimuat. Tapi ini telah diperluas lebih dari sekadar EL, ke SSJS juga. Setelah hash atau dolar, tanda kurung kurawal menunjukkan awal dan akhir bahasa Anda. Ini akan menjadi penting saat kita akan menggabungkan bahasa nanti. "

chrisp7575
sumber
13
Tidak ada yang ada hubungannya dengan Spring EL, ini berbicara tentang JSP EL.
Skaffman
@skaffman: walaupun benar tapi tentunya info yang menarik (setidaknya buat saya ...).
sjngm
Jawaban lain mengatakan bahwa "tidak ada JSP EL, JSP menggunakan SpEL". Apakah itu benar?
Carl G
1
Ada "Expression Language" (EL) di spesifikasi Java EE yang dimaksudkan untuk digunakan di JSP dan JSF. Ini tidak ada hubungannya dengan Spring EL.
gregfqt
-4

Spesifikasi Bahasa Ekspresi • Rilis Akhir - 8 Mei 2006

Halaman 2:

Eval-ekspresi dibentuk dengan menggunakan konstruksi $ {expr} atau # {expr}. Kedua konstruksi tersebut diurai dan dievaluasi dengan cara yang persis sama oleh EL, meskipun keduanya mungkin memiliki arti yang berbeda dalam teknologi yang menggunakan EL.

Mellon
sumber
2
Bagian mana dari pertanyaan saya yang seharusnya dijawab ini? Ini dari tahun 2006 dan kata-kata seperti "diuraikan dan dievaluasi dengan cara yang persis sama" dan "mungkin membawa arti yang berbeda" mungkin masih samar-samar.
sjngm