อินเทอร์เฟซ InitializingBean ให้วิธีการเริ่มต้นวิธีการสำหรับถั่ว มันรวมเฉพาะวิธี Afterpropertiesset คลาสใด ๆ ที่สืบทอดอินเตอร์เฟสจะดำเนินการวิธีการเมื่อเริ่มต้นถั่ว
ทดสอบดังนี้:
นำเข้า org.springframework.beans.factory.initializingBean; Public Class Public TestinitializingBean ใช้การเริ่มต้น {@Override โมฆะสาธารณะ Afterpropertiesset () โยนข้อยกเว้น {System.out.println ("Ceshi InitializingBean"); } โมฆะสาธารณะ testinit () {system.out.println ("ceshi init-method"); -ไฟล์กำหนดค่า
<bean id = "testinitializingbean"> </ebean>
ฟังก์ชั่นหลักมีดังนี้
คลาสสาธารณะหลัก {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {applicationcontext context = ใหม่ filesystemxmlapplicationContext ("/src/main/java/com/beans.xml"); -ผลการทดสอบคือ:
Ceshi InitializingBean
ซึ่งหมายความว่าเมื่อฤดูใบไม้ผลิเริ่มต้นถั่วหากถั่วใช้อินเทอร์เฟซเริ่มต้นเบียนเมธอด afterpropertiesset จะถูกเรียกโดยอัตโนมัติ
ดังนั้นปัญหาคือเมื่อกำหนดค่าถั่วคุณยังสามารถกำหนดค่าวิธีการเริ่มต้นสำหรับถั่วโดยใช้การกำหนดค่าเริ่มต้น สองข้อใดที่จะดำเนินการก่อน ถัดไปทดสอบแก้ไขไฟล์การกำหนดค่าและเพิ่ม init-method:
<bean id = "testinitializingBean" init-method = "testinit"> </epean>
เรียกใช้โปรแกรมและรับผลลัพธ์:
Ceshi InitializingBean
CESHI INIT-Method
จากผลลัพธ์เราจะเห็นได้ว่าเมื่อฤดูใบไม้ผลิเริ่มต้นถั่วหากถั่วใช้อินเตอร์เฟส itiedizingBean และระบุวิธีการเริ่มต้นในไฟล์การกำหนดค่าระบบจะเรียกเมธอด afterpropertieset () ก่อนแล้วเรียกใช้วิธีการที่ระบุไว้ใน init-method
ดังนั้นวิธีนี้ใช้วิธีนี้ในฤดูใบไม้ผลิอย่างไร? เมื่อดูที่คลาสซอร์สโค้ดคลาสของถั่วสปริงโหลดคุณสามารถเห็นความลึกลับ InvokeInitMethods ในคลาส AbstractautoAtowiredCapableBeanFactory มีความชัดเจนมากดังนี้:
เป็นโมฆะที่ได้รับการป้องกัน InvokeInitMethods (String Beanname, Final Object Bean, RootBeanDefinition MBD) โยนได้ {// ตัดสินว่าถั่วได้ดำเนินการอินเทอร์เฟซ itiedizingBean หรือไม่ หากมีการใช้งานอินเทอร์เฟซ InitializingBean จะมีเพียงวิธี Afterpropertiesset ของถั่วที่เรียกว่า Boolean isInitializingBean = (ถั่วอินสแตนซ์ของการเริ่มต้นเบียน); if (isInitializingBean && (mbd == null ||! mbd.isexternallyManagedInitMethod ("Afterpropertiesset")))) {ถ้า (logger.isdebugenabled ()) {logger.debug ( } if (system.getSecurityManager ()! = null) {ลอง {accessController.doprivileged (PrivilegedExceptionAction ใหม่ <Pocount> () {วัตถุสาธารณะรัน () โยนข้อยกเว้น {// เรียกโดยตรง retionpropertiesset (returnizingbean) } catch (privilegedActionException pae) {โยน pae.getException (); }} else {// โทรโดยตรง fterpropertIesset ((initializingBean) ถั่ว) .AfterPropertIesset (); }}} if (mbd! = null) {string initMethodName = mbd.getInitMethodname (); // แยกแยะว่ามีการระบุวิธีการเริ่มต้นหรือไม่ หากมีการระบุวิธีการเริ่มต้น-วิธีการเริ่มต้นที่กำหนดไว้ถ้า (initMethodname! = null &&! (isInitializingBean && "afterpropertiesset" .Equals (initMethodname)) &&! mbd.isexternally วิธีการเริ่มต้นคือการใช้ InvokecustominitMethod (Beanname, Bean, MBD); -สรุป:
1. สปริงให้ถั่วสองวิธีในการเริ่มต้นถั่วใช้อินเตอร์เฟส itiedizingBean ใช้วิธี AfterPropertIesset หรือระบุผ่านวิธีการเริ่มต้นในไฟล์การกำหนดค่า ทั้งสองวิธีสามารถใช้ในเวลาเดียวกัน
2. การใช้งานอินเทอร์เฟซ InitializingBean เรียกวิธี AfterPropertIesset โดยตรงซึ่งมีประสิทธิภาพมากกว่าการเรียกวิธีการที่ระบุโดยผู้เริ่มต้นผ่านการสะท้อน แต่วิธีการเริ่มต้นจะช่วยลดการพึ่งพาสปริง
3. หากเกิดข้อผิดพลาดเมื่อเรียกใช้เมธอด AfterPropertIesset วิธีการที่ระบุโดยวิธีการเริ่มต้นจะไม่ถูกเรียก
บทบาทของ Spring InitializingBean
อินเทอร์เฟซการเริ่มต้นของ Spring มีประโยชน์มาก มันตั้งอยู่ในถั่วฤดูใบไม้ผลิ มันมีเพียงวิธีเดียวหลังจาก propropertiesset () เมื่อคุณใช้วิธีนี้สปริงจะให้การสนับสนุนระดับเฟรมเวิร์ก: เมื่อคุณสร้างอินสแตนซ์ของคลาสที่ใช้อินเทอร์เฟซผ่านคอนเทนเนอร์ Sring มันจะเรียกวิธี Afterpropertiesset ด้วยวิธีนี้คุณสามารถตรวจสอบได้ว่าถั่วของคุณเริ่มต้นอย่างถูกต้องหรือไม่ แน่นอนคุณยังสามารถใช้วิธีการเริ่มต้น วิธีการทั้งสองนี้สามารถใช้ในเวลาเดียวกันและลำดับการโทรเป็นวิธีการเริ่มต้น
สรุป
ด้านบนคือการใช้อินเทอร์เฟซ InitializingBean ในฤดูใบไม้ผลิที่แนะนำโดยตัวแก้ไข ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับคุณทันเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!