ฉันแยกแยะว่าฤดูใบไม้ผลิจัดการวัตถุ Java ด้วยตัวอย่างง่ายๆ
ก่อนอื่นกำหนด pojo ง่าย ๆ รหัสมีดังนี้:
แพ็คเกจ com.jvk.ken.spring; การสาธิตคลาสสาธารณะ {ชื่อสตริงส่วนตัว; การสาธิตสาธารณะ () {name = "ฉันสาธิต";} โมฆะสาธารณะ printname () {system.out.println (ชื่อ);} โมฆะสาธารณะ setname (ชื่อสตริง)ไฟล์การกำหนดค่าสปริงที่เกี่ยวข้องมีดังนี้:
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://ww.w3.org/2001/xml xmlns: context = "http://www.springframework.org/schema/context" xsi: schemalocation = "http://www.springframework.org/schema/context http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3
รหัสทดสอบอย่างง่ายมีดังนี้:
แพ็คเกจ com.jvk.ken.spring; นำเข้า org.springframework.beans.factory.beanfactory; นำเข้า org.springframework.beans.factory.xml.xmlbeanfactory; นำเข้า {testspring ();} โมฆะคงที่ส่วนตัว testspring () พ่นข้อยกเว้น {beanfactory bf = ใหม่ xmlbeanfactory (ใหม่ classpathresource ("applicationcontext.xml")); demo bean = (demo) bf.getBean ("demo");เรียกใช้คลาสทดสอบและส่งออกข้อมูลต่อไปนี้ระบุว่าตัวอย่างสปริงแบบง่ายได้ทำงานสำเร็จแล้ว
2012-3-28 22:18:07 org.springframework.beans.factory.xml.xmlbeanDefinitionReader loadBeanDefinitions ข้อมูล: การโหลดคำจำกัดความของถั่ว XML จากทรัพยากรเส้นทางของคลาส
จากรหัสการกำหนดค่า Java สั้น ๆ และไฟล์ XML เราจะเห็นได้ว่า XMLBeanFactory ประกอบ Javabean โดยการอ่านไฟล์การกำหนดค่า XML และส่งคืนวัตถุที่ต้องการเมื่อผู้ใช้เรียกวิธี GetBean เพื่อเลียนแบบพฤติกรรมของมันฉันกำหนด beanfactory ง่าย ๆ
แพ็คเกจ com.jvk.ken.spring; นำเข้า java.util.hashmap; นำเข้า java.util.map; คลาสสาธารณะ myBeanfactory {// บันทึกคำจำกัดความของแผนที่ถั่ว <สตริงคลาส> beans = new hashmap <String, class> () beans.get (id) .newinstance ();} สตริงส่วนตัว xmlfile; mybeanfactory สาธารณะ (สตริง xmlfile) พ่น classnotfoundexception {super (); this.xmlfile = xmlfile; init ();} โมฆะส่วนตัว init () พ่น classnotfoundexception {// เริ่มต้นและแยกวิเคราะห์ xml การแยกวิเคราะห์จริงของ XML ถูกละไว้ที่นี่และใช้รหัสยากเพื่อเลียนแบบ System.out.println ("ไฟล์การกำหนดค่า:" "com.jvk.ken.spring.demo"; คลาส <?> loadclass = this.getClass (). getClassloader (). loadclass (className); beans.put ("ตัวอย่าง", loadclass);}}}}}}}รหัสทดสอบมีดังนี้:
แพ็คเกจ com.jvk.ken.spring; การทดสอบระดับสาธารณะ {โมฆะคงที่สาธารณะหลัก (String [] args) โยนข้อยกเว้น {testnotspring ();} โมฆะส่วนตัวคงที่ testnotspring () โยนข้อยกเว้น bf.getBean ("demo"); system.out.println (bean.getclass ()); bean.printname ();}}หลังจากทำงานแล้วข้อมูลต่อไปนี้จะถูกส่งออก:
ไฟล์การกำหนดค่า: ApplicationContext.xml คลาส com.jvk.ken.spring.demo ฉันสาธิต
รหัสสั้นข้างต้นแสดงให้เห็นว่าฤดูใบไม้ผลิทำหน้าที่เป็นโรงงานถั่วที่ง่ายที่สุด มาปรับรหัสเล็กน้อยด้านล่างเพื่อวิเคราะห์ว่าเกิดอะไรขึ้นในฤดูใบไม้ผลิ ก่อนอื่นให้เปลี่ยนวิธีการก่อสร้างแบบไม่มีพารามิเตอร์ของคลาสสาธิตเป็นส่วนตัว
การสาธิตส่วนตัว () {name = "ฉันคือตัวอย่าง"; -การเรียกใช้รหัสทดสอบเปิดเผยว่าไม่มีความแตกต่างในผลการทดสอบฤดูใบไม้ผลิ แต่ MyBeanFactory ที่ปรับแต่งของฉันรายงานข้อความแสดงข้อผิดพลาดต่อไปนี้:
ข้อยกเว้นในเธรด "หลัก" java.lang.illegalaccessexception: คลาส com.jvk.ken.spring.mybeanfactory ไม่สามารถเข้าถึงสมาชิกของคลาส com.jvk.ken.spring.demo กับตัวดัดแปลง "ส่วนตัว" ที่ sun.reflect.reflection.ensurememberaccess java.lang.class.newinstance0 (class.java:349) ที่ java.lang.class.newinstance (class.java:308) ที่ com.jvk.ken.spring.mybeanfactory.getBean com.jvk.ken.spring.test.testnotspring (test.java:25) ที่ com.jvk.ken.spring.test.main (test.java:9)
ฤดูใบไม้ผลิช่างมหัศจรรย์มาก? ไม่รหัสที่ฉันเขียนนั้นง่ายเกินไปและสามารถทำงานได้โดยตรงด้วยการปรับเปลี่ยนเล็กน้อย
วัตถุสาธารณะ GetBean (String ID) พ่นข้อยกเว้น {class1 = beans.get (id); Constructor DecraredConstructor = class1.getDeclaredConstructor (); ประกาศ constructor.setAccessible (จริง); return decraredConstructor.newinstance (); -ข้างต้นเป็น javabean ที่บริสุทธิ์ที่สุดที่จัดการโดยคอนเทนเนอร์ฤดูใบไม้ผลิ ฤดูใบไม้ผลิยังรองรับถั่วชนิดอื่นที่เรียกว่าโรงงานถั่วตัวอย่างดีกว่าหนึ่งพันคำโปรดดูรหัส
แพ็คเกจ com.jvk.ken.spring; นำเข้า org.springframework.beans.factory.factorybean; demofactory คลาสสาธารณะใช้โรงงาน {@Override วัตถุสาธารณะ getObject () โยนข้อยกเว้น {คืน demo ใหม่ ();}@override เท็จ;}}หลังจากเพิ่มคลาส demofactory ให้แก้ไขไฟล์การกำหนดค่าสปริงในเวลาเดียวกัน
<Bean ID = "Demo" />
รหัสอื่นไม่ได้รับการแก้ไข หลังจากเรียกใช้รหัสทดสอบผลลัพธ์ผลลัพธ์จะเหมือนเดิมอย่างแน่นอน เหตุใดคลาส com.jvk.ken.spring.demofactory กับ ID จึงถูกกำหนดค่า แต่ผลลัพธ์ที่ส่งคืนเป็นอินสแตนซ์ตัวอย่าง? นี่เป็นเพราะสปริงตรวจพบว่า demofactory เป็นถั่วพิเศษที่ใช้อินเทอร์เฟซโรงงาน วิธี getObject จะถูกเรียกก่อนส่งคืนผลลัพธ์ดังนั้นผลลัพธ์สุดท้ายคือวัตถุสาธิต แน่นอนถ้าเราจำเป็นต้องได้รับถั่วจากโรงงานเราสามารถเขียน bf.getBean ("& demo") เช่นนี้
สรุป
ข้างต้นเป็นคำอธิบายโดยละเอียดทั้งหมดของรหัสการสร้างวัตถุถั่วฤดูใบไม้ผลิฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!