การใช้ไฟล์ XML เพื่อกำหนดค่าในไฟล์การกำหนดค่าสปริงจริง ๆ แล้วขอให้สปริงเรียกใช้งานรหัสที่เกี่ยวข้องเช่น:
การใช้องค์ประกอบ <bean> นั้นจริง ๆ แล้วเพื่อให้สปริงดำเนินการคอนสตรัคเตอร์ที่ไม่มีพารามิเตอร์หรือพารามิเตอร์ที่มีส่วนประกอบของตัวสร้าง <คุณสมบัติ> จริง ๆ
อย่างไรก็ตามโปรแกรม Java อาจมีคำสั่งประเภทอื่น ๆ เช่นการเรียกใช้วิธีการเรียกร้องการโทรวิธีการทั่วไปการเข้าถึงฟิลด์ของคลาสหรือวัตถุ ฯลฯ สปริงยังมีไวยากรณ์การกำหนดค่าที่สอดคล้องกันสำหรับคำสั่งดังกล่าว:
วิธีการโทรหา getter: ใช้ PropertyPathFactoryBean
เรียกค่าที่ยื่นของคลาสหรือวัตถุ: ใช้ FileDretrievingFactoryBean
การเรียกใช้วิธีปกติ: ใช้วิธีการต่างๆ
ฉีดค่าคุณสมบัติของถั่วอื่น
PropertyPathFactoryBean ใช้เพื่อรับค่าคุณสมบัติของถั่วเป้าหมาย (จริง ๆ แล้วค่าที่ส่งคืนโดยการเรียกวิธีการ getter) ค่าที่ได้รับสามารถฉีดเข้าไปในถั่วอื่น ๆ หรือถั่วใหม่สามารถกำหนดได้โดยตรง ดูไฟล์กำหนดค่าต่อไปนี้:
<Bean ID = "Person"> <property name = "Age" value = "30"/> <property name = "son"> <!-ใช้ถั่วซ้อนกันเพื่อกำหนดค่าคุณสมบัติ-> <Bean> <ชื่อทรัพย์สิน = "อายุ" ค่า = "11"/> </epean> </property> son2-> <property name = "อายุ"> <!-โปรดทราบว่า PropertyPathFactoryBean ถูกใช้ที่นี่-> <bean id = "person.son.age"/> </property> </ebean>
คุณสมบัติของคลาสบุคคลและลูกชายสามารถมองเห็นได้จากไฟล์การกำหนดค่าซึ่งไม่ได้รับอีกต่อไป โปรแกรมหลักมีดังนี้:
การทดสอบคลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง args []) {applicationcontext ac = ใหม่ classpathxmlapplicationContext ("applicationcontext.xml"); System.out.println ("age =" + ac.getBean ("son2", son.class) .getage ()); - ผลลัพธ์ผลลัพธ์:
อายุ = 11
ค่าคุณสมบัติของอินสแตนซ์ถั่วไม่เพียงสามารถฉีดถั่วอีกตัวเท่านั้น แต่ยังกำหนดค่าคุณสมบัติโดยตรงของอินสแตนซ์ถั่วเป็นอินสแตนซ์ถั่ว สิ่งนี้ทำผ่าน PropertyPathFactoryBean เพิ่มย่อหน้านี้ลงในไฟล์กำหนดค่าด้านบน:
<bean id = "son1"> <!-กำหนดถั่วเป้าหมายระบุว่าส่วนประกอบของ son1 มาจาก-> <name property = "targetBeanName" value = "person" /> <!
ดำเนินการคลาสทดสอบด้านบนและแทนที่ SON2 ด้วย SON1 และผลลัพธ์ก็เหมือนกัน
ฉีดค่าฟิลด์ของถั่วอื่น
ผ่านคลาส FieldRetrievingFactoryBean คุณสามารถฉีดค่าฟิลด์ของถั่วอื่น ๆ ลงในถั่วอื่นหรือคุณสามารถกำหนดถั่วใหม่ได้โดยตรง นี่คือคลิปการกำหนดค่า:
<bean id = "son"> <property name = "อายุ"> <bean id = "java.sql.connection.transaction_serializable"/> </porement> </ebean>
โปรแกรมทดสอบหลักนั้นคล้ายกับคำจำกัดความข้างต้นและไม่ได้ให้ไว้ที่นี่อีกต่อไปและผลการดำเนินการมีดังนี้:
อายุ = 8
ในการกำหนดค่านี้ค่าของอายุของวัตถุ SON เท่ากับค่าของ java.sql.connection.transaction_serializable ในคำจำกัดความข้างต้นเมื่อกำหนดถั่วโรงงาน FieldRetrievingFactoryBean ID ที่ระบุไม่ได้เป็นตัวระบุที่ไม่ซ้ำกันของอินสแตนซ์ถั่ว แต่การแสดงออกของฟิลด์ (นั่นคือค่าที่จะนำออกมา)
หมายเหตุ: ฟิลด์สามารถเป็นแบบคงที่หรือไม่คงที่ นิพจน์ฟิลด์ที่ระบุโดยตัวอย่างการกำหนดค่าด้านบนเป็นค่าฟิลด์คงที่ดังนั้นจึงสามารถเข้าถึงได้โดยตรงผ่านชื่อคลาส หากค่าฟิลด์ไม่คงที่ควรเข้าถึงผ่านถั่วที่มีอยู่แล้วในคอนเทนเนอร์นั่นคือวลีแรกของนิพจน์ฟิลด์ควรเป็นถั่วที่มีอยู่แล้วในคอนเทนเนอร์
ค่าฟิลด์สามารถกำหนดเป็นอินสแตนซ์ถั่วได้เช่นเพิ่มย่อหน้าต่อไปนี้ในไฟล์กำหนดค่า:
<bean id = "อายุ"> <!-TargetClass ระบุคลาสเป้าหมายที่ฟิลด์อยู่-> <property name = "targetClass" value = "java.sql.Connection" /> <!
เพิ่มผลลัพธ์ต่อไปนี้ในโปรแกรมหลัก:
System.out.println ("age =" + ac.getBean ("อายุ"));
ผลการดำเนินการเหมือนกับข้างต้น
เมื่อใช้ FieldRetrievingFactoryBean เพื่อรับค่าฟิลด์คุณต้องระบุคุณสมบัติสองประการต่อไปนี้:
TargetClass หรือ TargetObject: ใช้เพื่อระบุการสะสมเป้าหมายหรือวัตถุเป้าหมายที่ค่าฟิลด์อยู่ หากฟิลด์ที่คุณต้องการได้รับนั้นคงที่ให้ใช้ TargetClass เพื่อระบุการสะสมเป้าหมาย หากฟิลด์ไม่คงที่ให้ใช้ TargetObject เพื่อระบุวัตถุเป้าหมาย
TargetField: ระบุชื่อฟิลด์ของคลาสเป้าหมายหรือวัตถุเป้าหมาย
หากสนามเป็นสนามคงที่มีวิธีที่กระชับกว่าในการเขียน:
<bean id = "อายุ"> <!-ค่าระบุค่าโดเมนแบบคงที่ใดที่คลาส-> <property name = "Staticfield" value = "java.sql.connection.transaction_serializable" /> </epean>
วิธีการที่ฉีดค่าคืนถั่วอื่น ๆ
ผ่าน MethodInvokingFactoryBean Factory Bean ค่าส่งคืนของวิธีการเป้าหมายสามารถฉีดเข้าไปในค่าคุณสมบัติของถั่ว ถั่วโรงงานนี้ใช้เพื่อให้ได้ค่าส่งคืนของวิธีการที่ระบุ วิธีการอาจเป็นวิธีการคงที่หรือวิธีการอินสแตนซ์; ค่านี้สามารถฉีดลงในแอตทริบิวต์ที่ระบุของอินสแตนซ์ถั่วที่ระบุหรือกำหนดโดยตรงเป็นอินสแตนซ์ถั่ว ดูตัวอย่าง:
<bean id = "valueGenerator" /> <bean id = "son1"> <property name = "อายุ"> <!-รับวิธีการส่งคืนค่า: เรียกวิธีการ getValue ของ valueGenerator-> <bean> <property name = "targetObject" ref = "valueGenerator" /> <property name = "targetMethod"
นี่คือ ValueGenerator:
คลาสสาธารณะ ValueGenerator {public int getValue () {return 2; } สาธารณะคงที่ int getStaticValue () {return 3;}} โปรแกรมทดสอบยังคงพิมพ์ค่าของอายุใน SON1 รหัสจะถูกละเว้นและผลลัพธ์มีดังนี้:
อายุ = 2
หากคุณต้องการเรียกวิธีการคงที่ให้แก้ไขการกำหนดค่าเป็น:
<bean id = "son1"> <property name = "age"> <!-รับวิธีการส่งคืนเมธอด: เรียกวิธี getStaticValue ของ valueGenerator-> <bean> <property name = "targetClass" value = "com.abc.util.valueGenerator"/> <property name = "targetMethod
ผลการทดสอบคือ:
อายุ = 3
เนื่องจาก Java รองรับการโอเวอร์โหลดมากเกินไปการให้ชื่อวิธีนี้ไม่เพียงพอที่จะกำหนดวิธีการโทร การกำหนดค่าข้างต้นสามารถเรียกได้สำเร็จเนื่องจากไม่มีวิธีใดใน ValueGenerator มีพารามิเตอร์ หากมีพารามิเตอร์ในวิธีการกำหนดค่าอย่างไร รวมเนื้อหาต่อไปนี้ในไฟล์กำหนดค่า:
<bean id = "sysprops"> <property name = "targetClass" value = "java.lang.system" /> <ชื่อคุณสมบัติ = "targetMethod" value = "getProperties" /> <bean> <bean id = "Javaversion"> <! value = "getProperty"/> <!-กำหนดค่าพารามิเตอร์ที่นี่-> <property name = "อาร์กิวเมนต์"> <!-ใช้รายการรายการเพื่อแสดงรายการพารามิเตอร์หลายตัวของวิธีการโทร-> <list> <value> java.version </alue>
ในตัวอย่างข้างต้นมันเทียบเท่ากับการเรียกใช้วิธี getProperty ของ java.lang.system ด้วย "java.version" เป็นพารามิเตอร์ ค่าที่ส่งคืนจะสร้างถั่วชื่อ Javaversion นั่นคือเทียบเท่ากับ:
Javaversion = java.lang.system.getProperty ("java.version");
เช่นเดียวกับฟิลด์ในบทความก่อนหน้านี้หากวิธีการที่เรียกว่าเป็นวิธีการคงที่ก็มีวิธีที่กระชับมากขึ้น:
<bean id = "myBean"> <!-ใช้คุณสมบัติ StaticMethod เพื่อระบุวิธีการเป้าหมายโดยตรงของคลาสเป้าหมาย-> <property name = "StaticMethod" value = "com.abc.util.valueGenerator.getStaticValue" /> </epean>
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น