Saya memiliki banyak kacang Spring yang diambil dari classpath melalui penjelasan, misalnya
@Repository("personDao")
public class PersonDaoImpl extends AbstractDaoImpl implements PersonDao {
// Implementation omitted
}
Di file Spring XML, didefinisikan PropertyPlaceholderConfigurer :
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="/WEB-INF/app.properties" />
</bean>
Saya ingin menyuntikkan salah satu properti dari app.properites ke dalam kacang yang ditunjukkan di atas. Saya tidak bisa begitu saja melakukan sesuatu
<bean class="com.example.PersonDaoImpl">
<property name="maxResults" value="${results.max}"/>
</bean>
Karena PersonDaoImpl tidak memiliki fitur dalam file Spring XML (ini diambil dari classpath melalui anotasi). Saya punya sejauh berikut:
@Repository("personDao")
public class PersonDaoImpl extends AbstractDaoImpl implements PersonDao {
@Resource(name = "propertyConfigurer")
protected void setProperties(PropertyPlaceholderConfigurer ppc) {
// Now how do I access results.max?
}
}
Tetapi tidak jelas bagi saya bagaimana saya mengakses properti yang saya minati ppc
?
java
spring
dependency-injection
Dónal
sumber
sumber
PropertyPlaceholderConfigurer
tidak lagi kelas yang direkomendasikan. Lebih sukaPropertySourcesPlaceholderConfigurer
sebagai gantinya. Bagaimanapun, Anda dapat menggunakan definisi XML yang lebih pendek<context:property-placeholder />
.Jawaban:
Anda dapat melakukan ini di Spring 3 menggunakan dukungan EL. Contoh:
systemProperties
adalah objek implisit danstrategyBean
merupakan nama kacang.Satu lagi contoh, yang berfungsi saat Anda ingin mengambil properti dari
Properties
objek. Itu juga menunjukkan bahwa Anda dapat menerapkan@Value
ke bidang:Berikut adalah posting blog yang saya tulis tentang ini untuk info lebih lanjut.
sumber
systemProperties
sederhanaSystem.getProperties()
? Saya kira jika saya ingin menyuntikkan properti saya sendiri ke dalam kacang Spring, saya perlu mendefinisikan nilai<bean id="appProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
kemudian membaca dari itu ke kacang lain menggunakan sesuatu seperti@Value("#{appProperties.databaseName}")
Secara pribadi saya suka cara baru ini di Spring 3.0 dari dokumen :
Tidak ada getter atau setter!
Dengan properti yang dimuat melalui konfigurasi:
Untuk menambah kegembiraan saya, saya bahkan dapat mengontrol klik pada ekspresi EL di IntelliJ dan itu membawa saya ke definisi properti!
Ada juga versi yang sepenuhnya non xml :
sumber
Ada anotasi baru
@Value
di Spring 3.0.0M3 .@Value
mendukung tidak hanya#{...}
ekspresi tetapi${...}
placeholder jugasumber
<context:property-placeholder ... />
adalah XML yang setara dengan PropertyPlaceholderConfigurer.Contoh: applicationContext.xml
Kelas komponen
sumber
<context:component-scan base-package="com.company.package" />
Untuk referensi, saya menggunakan pegas melaluiApplicationContext
, bukan dalam konteks web.Alternatif lain adalah menambahkan kacang appProperties yang ditunjukkan di bawah ini:
Ketika diambil, kacang ini dapat dilemparkan ke
java.util.Properties
yang akan berisi properti bernamaresults.max
yang nilainya dibacaapp.properties
. Sekali lagi, kacang ini dapat disuntikkan ketergantungan (sebagai instance dari java.util.Properties) ke dalam kelas apa pun melalui anotasi @Resource.Secara pribadi, saya lebih suka solusi ini (daripada yang saya usulkan), karena Anda dapat membatasi properti mana yang diekspos oleh appProperties, dan tidak perlu membaca app.properties dua kali.
sumber
Saya perlu memiliki dua file properti, satu untuk produksi dan override untuk pengembangan (yang tidak akan digunakan).
Untuk memiliki keduanya, Properties Bean yang dapat diotomatiskan dan PropertyConfigurer, Anda dapat menulis:
dan referensi Properties Bean di PropertyConfigurer
sumber
Sebelum kita mendapatkan Spring 3 - yang memungkinkan Anda untuk menyuntikkan konstanta properti langsung ke kacang Anda menggunakan anotasi - saya menulis sub-kelas kacang PropertyPlaceholderConfigurer yang melakukan hal yang sama. Jadi, Anda dapat menandai setter properti Anda dan Spring akan mengotomatiskan properti Anda ke dalam kacang Anda seperti:
Anotasi adalah sebagai berikut:
PropertyAnnotationAndPlaceholderConfigurer adalah sebagai berikut:
Jangan ragu untuk memodifikasi sesuai selera
sumber
Anda juga dapat membubuhi keterangan kelas Anda:
Dan memiliki variabel seperti ini:
Sekarang Anda dapat mengakses semua properti Anda dengan cara ini:
sumber
Cara musim semi:
private @Value("${propertyName}") String propertyField;
adalah cara baru untuk menyuntikkan nilai menggunakan kelas "PropertyPlaceholderConfigurer" Spring. Cara lain adalah menelepon
Catatan: Untuk @Nilai, Anda tidak dapat menggunakan propertyField statis , itu harus non-statis saja, jika tidak mengembalikan null. Untuk memperbaikinya setter non-statis dibuat untuk bidang statis dan @Nilai diterapkan di atas setter itu.
sumber
Seperti disebutkan
@Value
melakukan pekerjaan dan cukup fleksibel karena Anda dapat memiliki pegas EL di dalamnya.Berikut adalah beberapa contoh, yang dapat membantu:
Lain untuk mendapatkan
set
darilist
Anda juga dapat mengatur nilai untuk tipe primitif.
Anda dapat memanggil metode statis:
Anda dapat memiliki logika
sumber
Solusi yang mungkin adalah dengan mendeklarasikan kacang kedua yang dibaca dari file properti yang sama:
Kacang bernama 'appProperties' adalah tipe java.util.Properties dan dapat disuntikkan ketergantungan menggunakan attruibute @Resource yang ditunjukkan di atas.
sumber
Jika Anda terjebak menggunakan Spring 2.5, Anda bisa menentukan kacang untuk masing-masing properti Anda dan menyuntikkannya menggunakan kualifikasi. Seperti ini:
dan
Tidak super mudah dibaca tetapi menyelesaikan pekerjaan.
sumber
Nilai Properti Autowiring ke dalam Kacang Musim Semi:
Sebagian besar orang tahu bahwa Anda dapat menggunakan @Autowired untuk memberi tahu Spring untuk menyuntikkan satu objek ke objek lain saat memuat konteks aplikasi Anda. Nugget informasi yang kurang diketahui adalah Anda juga dapat menggunakan anotasi @Value untuk menyuntikkan nilai dari file properti ke atribut bean. lihat posting ini untuk info lebih lanjut ...
barang baru di Spring 3.0 || nilai kacang autowiring || nilai properti autowiring di musim semi
sumber
Bagi saya, itu adalah jawaban @ Lucky, dan khususnya, garis
dari halaman Kapten Debug
itu memperbaiki masalah saya. Saya memiliki aplikasi berbasis ApplicationContext yang berjalan dari command-line, dan menilai dari sejumlah komentar di SO, Spring memasang ini secara berbeda ke aplikasi berbasis MVC.
sumber
Saya pikir ini cara paling mudah untuk menyuntikkan properti ke dalam kacang adalah metode setter.
Contoh:
Definisi kacang xml:
Untuk setiap
property
metode yang disebutkansetProperty(value)
akan dipanggil.Cara ini sangat membantu jika Anda membutuhkan lebih dari satu kacang berdasarkan satu implementasi.
Misalnya, jika kita mendefinisikan satu kacang lagi dalam xml:
Maka kode seperti ini:
Akan dicetak
Jadi, dalam kasus Anda seharusnya terlihat seperti ini:
sumber
Jika Anda membutuhkan fleksibilitas lebih untuk konfigurasi, coba Settings4jPlaceholderConfigurer: http://settings4j.sourceforge.net/currentrelease/configSpringPlaceholder.html
Dalam aplikasi kami, kami menggunakan:
Urutan default yang sumber kunci-nilai diperiksa pertama kali, dijelaskan di:
http://settings4j.sourceforge.net/currentrelease/configDefault.html
Ia dapat dikustomisasi dengan settings4j.xml (akurat untuk log4j.xml) di jalan setapak kelas.
Beri tahu saya pendapat Anda: [email protected]
dengan hormat,
Harald
sumber
Gunakan kelas "PropertyPlaceholderConfigurer" Spring
Contoh sederhana yang memperlihatkan file properti dibaca secara dinamis sebagai properti bean
File Properti
dev.app.jdbc.driver = com.mysql.jdbc.Driver
dev.app.jdbc.url = jdbc: mysql: // localhost: 3306 / addvertisement
dev.app.jdbc.username = root
dev.app.jdbc.password = root
sumber