Menggunakan file XML untuk dikonfigurasi dalam file konfigurasi pegas sebenarnya meminta Spring untuk menjalankan kode yang sesuai, misalnya:
Menggunakan elemen <bean> sebenarnya untuk membiarkan pegas mengeksekusi konstruktor yang tidak diparameter atau yang mengandung parameter menggunakan elemen <propert>, sebenarnya untuk membiarkan pegas mengeksekusi metode setter sekali
Namun, program Java juga dapat memiliki jenis pernyataan lain: memanggil metode pengambil, memanggil metode biasa, mengakses bidang kelas atau objek, dll. Spring juga menyediakan sintaks konfigurasi yang sesuai untuk pernyataan tersebut:
Call Getter Metode: Gunakan PropertiPathFactoryBean
Memanggil nilai yang diajukan dari suatu kelas atau objek: Gunakan FileDretrievingFactoryBean
Memanggil metode normal: Gunakan MethodInvokingFactoryBean
Menyuntikkan nilai properti kacang lainnya
PropertiPathFactoryBean digunakan untuk mendapatkan nilai properti dari kacang target (sebenarnya nilai yang dikembalikan dengan memanggil metode pengambil). Nilai yang diperoleh dapat disuntikkan ke dalam kacang lain, atau kacang baru dapat didefinisikan secara langsung. Lihat file konfigurasi berikut:
<bean id="person"> <property name="age" value="30" /> <property name="son"> <!-- Use nested beans to define property values --> <bean> <property name="age" value="11" /> </bean> </property></bean><bean id="son2"> <!-- The age property is not directly injected, but assigns the age property of the son in person to the age property of son2-> <name properti = "Age"> <!-Perhatikan bahwa PropertiePathFactoryBean digunakan di sini-> <bean id = "person.son.age"/> </propert> </t bean>
Properti kelas orang dan anak dapat dilihat dari file konfigurasi, yang tidak lagi diberikan. Program utamanya adalah sebagai berikut:
tes kelas publik {public static void main (string args []) {applicationContext ac = new classpathxmlapplicationContext ("applicationContext.xml"); System.out.println ("usia =" + ac.getbean ("son2", son.class) .getage ()); }} Hasil output:
Usia = 11
Nilai properti dari instance kacang tidak hanya dapat menyuntikkan kacang lain, tetapi juga secara langsung mendefinisikan nilai properti dari instance kacang sebagai instance kacang. Ini juga dilakukan melalui PropertiPathFactoryBean. Tambahkan paragraf ini ke file konfigurasi di atas:
<bean id = "son1"> <!-tentukan kacang target, menunjukkan kacang mana komponen son1 berasal dari-> <name properti = "targetBeanName" value = "person" /> <!-tentukan atributnya, menunjukkan properti mana dari son1 berasal-> <nama properti = "propertipath" value = "son" /< /bean>
Jalankan kelas uji di atas dan ganti SON2 dengan SON1, dan hasilnya sama.
Menyuntikkan nilai bidang kacang lainnya
Melalui kelas FieldretrievingFactoryBean, Anda dapat menyuntikkan nilai lapangan kacang lain ke dalam kacang lain, atau Anda dapat secara langsung mendefinisikan kacang baru. Berikut klip konfigurasi:
<bean id = "son"> <properti name = "use"> <bean id = "java.sql.connection.transaction_serializable"/> </propert> </ bean>
Program uji utama mirip dengan definisi di atas, dan tidak lagi disediakan di sini, dan hasil eksekusi adalah sebagai berikut:
Usia = 8
Dalam konfigurasi ini, nilai usia objek Son sama dengan nilai java.sql.connection.transaction_serializable. Dalam definisi di atas, ketika mendefinisikan fieldretrievingfactorybean factory bean, ID yang ditentukan bukan pengidentifikasi unik dari instance kacang, tetapi ekspresi bidang (yaitu, nilai yang akan dikeluarkan).
Catatan: Bidang bisa statis atau non-statis. Ekspresi bidang yang ditentukan oleh cuplikan konfigurasi di atas adalah nilai bidang statis, sehingga dapat diakses langsung melalui nama kelas. Jika nilai bidang non -statis, itu harus diakses melalui kacang yang sudah ada dalam wadah - yaitu, frasa pertama dari ekspresi lapangan harus berupa kacang yang sudah ada dalam wadah.
Nilai bidang juga dapat didefinisikan sebagai instance kacang, misalnya, tambahkan paragraf berikut ke file konfigurasi:
<bean id = "usia"> <!-TargetClass menentukan kelas target di mana bidang berada-> <nama properti = "targetClass" value = "java.sql.connection" /> <!-Targetfield menentukan nama bidang-> <nama properti = "target" value = "transaction_serializable" /< /bean> < /bean>
Tambahkan output berikut ke program utama:
System.out.println ("usia =" + ac.getBean ("usia"));
Hasil eksekusi sama seperti di atas.
Saat menggunakan fieldretrievingFactoryBean untuk mendapatkan nilai lapangan, Anda harus menentukan dua properti berikut:
TargetClass atau TargetObject: Digunakan untuk menentukan akumulasi target atau objek target di mana nilai bidang berada. Jika bidang yang ingin Anda peroleh adalah statis, gunakan TargetClass untuk menentukan akumulasi target; Jika bidangnya non-statis, gunakan TargetObject untuk menentukan objek target.
Targetfield: Menentukan nama bidang kelas target atau objek target
Jika bidang adalah bidang statis, ada cara yang lebih ringkas untuk menulisnya:
<bean id = "usia"> <!-Nilai Menentukan nilai domain statis mana dari kelas mana-> <nama properti = "staticfield" value = "java.sql.connection.transaction_serializable" /> </ bean>
Metode yang menyuntikkan nilai mengembalikan kacang lainnya
Melalui MethodInvokingFactoryBean Factory Bean, nilai pengembalian metode target dapat disuntikkan ke dalam nilai properti kacang. Kacang pabrik ini digunakan untuk mendapatkan nilai pengembalian dari metode yang ditentukan. Metode ini dapat berupa metode statis atau metode instan; Nilai ini dapat disuntikkan ke atribut yang ditentukan dari instance kacang yang ditentukan atau secara langsung didefinisikan sebagai instance kacang. Lihat contoh:
<bean id = "valueGenerator" /> <bean id = "son1"> <name properti = "usia"> <!-Dapatkan metode pengembalian metode: Panggil metode getValue dari valueGenerator-> <bean> <nama properti = "targetObject" ref = "valueGenerator" /< /< /< /"targetMethod" value = "getValue"
Ini adalah valueGenerator:
Public Class ValueGenerator {public int getValue () {return 2; } public static int getStaticValue () {return 3;}} Program pengujian masih mencetak nilai usia di SON1, kode dihilangkan, dan hasilnya adalah sebagai berikut:
usia = 2
Jika Anda ingin memanggil metode statis, ubah konfigurasi ke:
<bean id="son1"> <property name="age"> <!-- Get method return value: call the getStaticValue method of valueGenerator--> <bean > <property name="targetClass" value="com.abc.util.ValueGenerator" /> <property name="targetMethod" value="getStaticValue" /> </bean> </property></bean>
Hasil tes adalah:
Usia = 3
Karena Java mendukung kelebihan beban, hanya memberikan nama metode tidak cukup untuk menentukan metode mana yang akan dihubungi. Konfigurasi di atas dapat dipanggil dengan sukses karena tidak ada metode di ValueGenerator yang memiliki parameter. Jika ada parameter dalam metode ini, bagaimana cara mengkonfigurasinya? Sertakan konten berikut dalam file konfigurasi:
<bean id = "sysprops"> <name properti = "targetclass" value = "java.lang.system" /> <name properti = "targetMethod" value = "getproperties" /> <bean> <bean id = "javaversion"> <! value = "getProperty"/> <!-Mengkonfigurasi parameter di sini-> <name properti = "argumen"> <!-Gunakan elemen daftar untuk mendaftar beberapa parameter dari metode panggilan-> <list> <value> java.version </ value> </list> </propert> <ean> <ean>
Dalam contoh di atas, setara dengan memanggil metode getProperty dari java.lang.system dengan "java.version" sebagai parameter. Nilai pengembalian akan membuat kacang bernama javaversion. Yaitu, setara dengan:
javaversion = java.lang.system.getProperty ("java.version");
Seperti bidang di artikel sebelumnya, jika metode yang akan dipanggil adalah metode statis, ada juga metode yang lebih ringkas:
<bean id = "mybean"> <!-Gunakan properti staticmethod untuk secara langsung menentukan metode target kelas target-> <name properti = "staticmethod" value = "com.abc.util.valugeGenerator.getstaticValue" /> </bean>
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.