บทความนี้ส่วนใหญ่ศึกษาเนื้อหาที่เกี่ยวข้องของคำสั่งการดำเนินการโหลดถั่วฤดูใบไม้ผลิดังต่อไปนี้
แหล่งที่มาของปัญหา:
มีถั่วที่เป็นและถั่วนั่นคือ B เมื่อ A เป็นอินสแตนซ์คุณต้องการกำหนดชื่อคุณสมบัติให้กับวิธีการ funb กับค่าคืนของ B.
ถ้ามันเพิ่งเขียนใน:
private B b;
private String name = b.funb();
จะมีการรายงานข้อผิดพลาดและ NullPointException เป็นเพราะ B ไม่ได้ถูกตั้งค่าในเวลานี้ดังนั้นจึงเป็นโมฆะ
การแก้ปัญหามีดังนี้รหัสและในเวลาเดียวกันเรียนรู้ลำดับการดำเนินการของการเริ่มต้นเบียนวิธีการก่อสร้างวัตถุและวิธีการเริ่มต้นในฤดูใบไม้ผลิ
คลาสสาธารณะ A ดำเนินการเริ่มต้นเบียน {ส่วนตัว b b; ชื่อสตริงส่วนตัว; // = b.funb (); โมฆะสาธารณะ setb (b b) {system.out.println ("A.SetB เริ่มต้น"); this.b = b;} สาธารณะ a () {system.out.println ("เริ่มต้น");} โมฆะสาธารณะ init () {system.out.println ("init"); this.name = b.funb ();}@แทนที่สตริงสาธารณะ toString () {return super.toString () + this.name;} โมฆะสาธารณะ Afterpropertiesset () โยนข้อยกเว้น {// ในความเป็นจริงมันเป็นไปได้ที่จะวางไว้ที่นี่ // this.name = b.funb (); System.out.println ("afterpropertiesset");}} คลาสสาธารณะ B {สตริงสาธารณะ funb () {system.out.println ("funb"); กลับ "b.funb";} สาธารณะ b () {system.out.println (ไฟล์การกำหนดค่าสปริง
<Beans default-autowire = "byname"> <bean id = "a" init-method = "init"> </epean> <bean id = "b"> </ebean> </ebeans>
รหัสทดสอบ:
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {applicationcontext context = new filesystemxmlapplicationContext ("src/testspring/bean.xml"); a = (a) บริบท getBean ("a"); system.out.println (a);};};};};เอาต์พุตโปรแกรมคือ:
เริ่มต้น
b เริ่มต้น
A.SetB เริ่มต้น
Afterpropertiesset
การเริ่มต้น
ความกลัว
[email protected]
จากที่นี่เราจะเห็นได้ว่าแอตทริบิวต์ชื่อของ A ถูกตั้งค่าเป็นค่าส่งคืนของวิธี FUNB ของ B เมื่อโหลดถั่ว จุดสำคัญคือการใช้วิธีการเริ่มต้นเพื่อนำไปใช้
คำสั่งโหลดสามารถมองได้ว่า:
ตัวสร้างครั้งแรก -> จากนั้น B SET Method Injection -> InitializingBean Method AfterPropertIesset -> วิธีการเริ่มต้น
เนื้อหาต่อไปนี้เป็นข้อความที่ตัดตอนมาจากหนังสือ แต่ฉันพบว่าแม้ว่าฉันจะตัดตอนมาครั้งเดียวความเข้าใจเนื้อหาของฉันจะลึกซึ้งยิ่งขึ้น!
1. กระบวนการของถั่วประกอบฤดูใบไม้ผลิ
1. อินสแตนซ์;
2. ตั้งค่าแอตทริบิวต์;
3. หากมีการใช้งานอินเทอร์เฟซ BeannameAwer ให้โทร SetBeanName เพื่อตั้งค่า ID หรือชื่อถั่ว
4. หากคุณใช้อินเทอร์เฟซ BeanFactoryAware ให้โทร SetBeanFactory เพื่อตั้งค่า beanfactory;
5. หากใช้งาน ApplicationContextAware ให้ใช้ setApplicationContext เพื่อตั้งค่า ApplicationContext
6. โทรหาวิธีการตั้งเริ่มต้นของ BeanPostProcessor;
7. โทรหาวิธี AfterPropertIesset () ของการเริ่มต้นเบียน;
8. เรียกวิธีการเริ่มต้นที่กำหนดเอง;
9. โทรหาวิธีการโพสต์การเริ่มต้นของ BeanPostProcessor;
กระบวนการปิดเครื่องสปริงคอนเทนเนอร์
1. โทร DisposableBean Destroy ();
2. เรียกวิธีการทำลายล้างที่กำหนดเอง;
1. ถั่วเดี่ยว
โหลด
1. อินสแตนซ์;
2. ตั้งค่าแอตทริบิวต์;
3. หากมีการใช้งานอินเทอร์เฟซ BeannameAwer ให้โทร SetBeanName เพื่อตั้งค่า ID หรือชื่อถั่ว
4. หากคุณใช้อินเทอร์เฟซ BeanFactoryAware ให้โทร SetBeanFactory เพื่อตั้งค่า beanfactory;
5. หากใช้งาน ApplicationContextAware ให้ใช้ setApplicationContext เพื่อตั้งค่า ApplicationContext
6. โทรหาวิธีการตั้งเริ่มต้นของ BeanPostProcessor;
7. โทรหาวิธี AfterPropertIesset () ของการเริ่มต้นเบียน;
8. เรียกวิธีการเริ่มต้นที่กำหนดเอง;
9. โทรหาวิธีการโพสต์การเริ่มต้นของ BeanPostProcessor;
สปริงคอนเทนเนอร์ปิด
1. โทร DisposableBean Destroy ();
2. เรียกวิธีการทำลายล้างที่กำหนดเอง;
2. คำสั่งของถั่วหลายชนิด
จัดลำดับความสำคัญในการโหลด BeanPostProcessor Bean
ตามลำดับของคำจำกัดความถั่วลำดับการโหลดถั่ว (แม้ว่าจะมีการเขียนทับ ID เมื่อโหลดไฟล์สปริงหลายไฟล์)
เมื่อ "ตั้งค่าแอตทริบิวต์" (ขั้นตอนที่ 2) เมื่อพบการอ้างอิงถั่วที่สอดคล้องกับ ID ของการอ้างอิงจะถูกโหลดก่อนหลังจาก "อินสแตนซ์" (ขั้นตอนที่ 1)
subclass ของ AbstractFactoryBean จะเรียกวิธี CreateInstance หลังจากขั้นตอนที่ 6 จากนั้นจะเรียกวิธี GetObjectType
คลาส BeanfactoryUtils จะเปลี่ยนลำดับการโหลดของถั่ว
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้เกี่ยวกับลำดับการใช้งานของการโหลดถั่วฤดูใบไม้ผลิและฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!