บทความนี้ส่วนใหญ่สรุปวิธีการโทรกลับและจุดขยายที่ได้รับจากคอนเทนเนอร์สปริงก่อนและหลังเริ่มต้นอินสแตนซ์ การใช้วิธีการและจุดขยายเหล่านี้การประมวลผลแบบลอจิคัลพิเศษบางอย่างสามารถทำได้ก่อนและหลังอินสแตนซ์การเริ่มต้นฤดูใบไม้ผลิ
ต่อไปนี้มีการแนะนำเป็นหลัก:
วิธีการเริ่มต้นวัฏจักรการเริ่มต้นวัฏจักรชีวิตระดับคลาสเริ่มต้นการกำหนดค่าอินเตอร์เฟสการเริ่มต้นเบียนและคำอธิบายประกอบ postconstruct
ส่วนต่อขยายระดับคอนเทนเนอร์ BeanPostProcessor และอินเตอร์เฟส BeanFactoryPostProcessor
1. การโทรกลับวงจรชีวิตระดับชั้นเรียน
1.1init-method
การอ้างอิง: SpringBeanxsdinit-method
Init-Method เป็นรายการการกำหนดค่าเมื่อประกาศถั่วในไฟล์การกำหนดค่าฤดูใบไม้ผลิ ค่าของรายการการกำหนดค่าเริ่มต้น-วิธีการเป็นวิธีที่ไม่มีพารามิเตอร์ในชั้นเรียน แต่สามารถโยนข้อยกเว้นได้ วิธีนี้จะถูกเรียกหลังจากคอนเทนเนอร์สปริงอินสแตนซ์วัตถุและตั้งค่าคุณสมบัติ
ฟังก์ชั่นที่สามารถนำไปใช้งานได้โดย init-method นั้นสอดคล้องกับอินเตอร์เฟส itiedizingBean และคำอธิบายประกอบ postconstruct
ไฟล์การกำหนดค่าสปริงและคลาสทดสอบมีดังนี้:
<bean id = "InitMethodBeanservice" init-method = "init"> <property name = "f2" value = "2"/> </ebean>
คลาสทดสอบมีดังนี้:
ระดับสาธารณะ initmethodbeanservice {เอกชนคงที่จำนวนเต็ม f1; จำนวนเต็มส่วนตัว f2; คงที่ {f1 = 1; system.out.println ("initmethodbeanservice บล็อกคงที่ ... ");} public initmethodbeanservice () init () {system.out.println ("initmethodbeanservice วิธีการเริ่มต้นดำเนินการ ... ");} จำนวนเต็มสาธารณะ getf2 () {return f2;} โมฆะสาธารณะ setf2 (จำนวนเต็ม f2) {this.f2 = f2; system.out.out.println (ผลการดำเนินการจะพิมพ์ดังนี้:
InitMethodbeanservice block คงที่ Execute ... InitMethodbeanservice Method Method Execute ... InitMethodbeanservice SetF2 วิธีการดำเนินการ ... InitMethodbeanservice Init เมธอดดำเนินการ ... วิธีทดสอบดำเนินการ ...
1.2InitializingBean Interface
การอ้างอิง: สปริงเอกสารอย่างเป็นทางการถั่วโรงพยาบาล-ลิฟ็อต-วงจรเริ่มต้นเบียน
อินเทอร์เฟซ InitializingBean ประกาศวิธีการ AfterPropertIesset ซึ่งเรียกว่าหลังจากคอนเทนเนอร์สปริงอินสแตนซ์วัตถุและตั้งค่าคุณสมบัติ มันสอดคล้องกับฟังก์ชั่นที่ใช้งานด้านบนวิธีการเริ่มต้นดังนั้นฤดูใบไม้ผลิจึงไม่แนะนำให้ใช้อินเทอร์เฟซ itiedizingBean
ตัวอย่างค่อนข้างง่ายไม่อยู่ในรายการ
1.3 PostConstruct Annotation
การแปล: เอกสารสปริงอย่างเป็นทางการถั่ว-โพสต์โครงสร้างและ predestroy-annotations
@PostConstruct Annotation เป็นวิธีการโทรกลับวงจรชีวิตที่สอดคล้องกับการใช้งานอินเทอร์เฟซเริ่มต้นและการเริ่มต้นเบียน
@PostConstructPublic เป็นโมฆะ postconstruct () {system.out.println ("postconstructservice วิธีการ postconstruct ดำเนินการ ... ");}สรุปวิธีการโทรกลับวงจรชีวิตสามวิธีข้างต้นวิธีการเริ่มต้นอินเตอร์เฟสการเริ่มต้นเบียน @PostConstruct คำอธิบายประกอบ
1. ทั้งหมดเป็นอินสแตนซ์และโพสต์โพสต์สำหรับชั้นเรียนเดี่ยว
2. เวลาดำเนินการเรียกว่าหลังการสร้างอินสแตนซ์ของคลาสและตัวแปรสมาชิกจะถูกฉีด
3. สำหรับการเริ่มต้นใช้วิธีการคุณยังสามารถกำหนดค่าวิธีการเริ่มต้นเริ่มต้นภายใต้องค์ประกอบถั่วของไฟล์การกำหนดค่าสปริงและรายการการกำหนดค่าเป็นค่าเริ่มต้นในวิธีการ
4. หากวิธีการเริ่มต้นที่กำหนดค่าในสามวิธีข้างต้นจะแตกต่างกันคำสั่งการดำเนินการคือ: @postConstruct Annotation วิธี> การเริ่มต้นของ BetpropertIesset> วิธีการเริ่มต้น-วิธีการ; หากวิธีการที่กำหนดค่าในสามวิธีจะเหมือนกันวิธีการจะถูกดำเนินการเพียงครั้งเดียว (ดูที่: สปริงเอกสารอย่างเป็นทางการของถั่ว-โรงงาน-ลิฟเฟอร์
5. มีวิธีการโทรกลับครั้งแรกและยังมีวิธีการโทรกลับที่ถูกทำลาย @PostConstruct คำอธิบายประกอบ> การเริ่มต้นของ BENTROPROPERTIESSET> วิธีการเริ่มต้นที่สอดคล้องกับวิธีการอธิบายประกอบ @Predestroy> วิธีการทำลายล้างของ DisposableBean> วิธีการทำลาย
2. ส่วนขยายระดับคอนเทนเนอร์
การแปล: สปริงเอกสารอย่างเป็นทางการ 3.8ContainerExtensionPoints
โดยทั่วไปนักพัฒนาไม่จำเป็นต้องปรับแต่งคลาสย่อยของ ApplicationContext เพื่อขยายคอนเทนเนอร์ SpringIoc คอนเทนเนอร์ SpringIOC สามารถบรรลุการขยายของภาชนะ SpringIOC ผ่านอินเทอร์เฟซที่เปิดเผย
2.1BeanPostProcessor อินเตอร์เฟส
2.1.1bean Instance Initialization ของ Postprocessor และ Postprocessor Chain
อินเทอร์เฟซ BeanPostProcessor กำหนดวิธีการโทรกลับระดับคอนเทนเนอร์สองวิธีหลังการกำหนดค่าก่อนกำหนดและ postprocessafterinitialization ซึ่งใช้สำหรับการประมวลผลเชิงตรรกะบางอย่างหลังจากเริ่มต้นอินสแตนซ์และจะถูกประมวลผลสำหรับทุกกรณีในคอนเทนเนอร์ คลาสที่ใช้อินเทอร์เฟซ BeanPostProcessor นั้นเรียกว่า Postprocessor การเริ่มต้นอินสแตนซ์ของถั่ว
หากโพสต์โปรเซสเซอร์การเริ่มต้นหลายอินสแตนซ์ถูกรวมเข้ากับคอนเทนเนอร์ SpringIoc ชุดของโปรเซสเซอร์ postprocessors เหล่านี้เรียกว่า Bean Instance Initialization Chain Postprocessor Chain
วิธีการ postprocessbeforeinitialization จะดำเนินการหลังจากการสร้างอินสแตนซ์ในชั้นเรียนและการฉีดตัวแปรของสมาชิกเสร็จสมบูรณ์และก่อนที่วิธีการเริ่มต้น (เช่นการเริ่มต้นเมธอด afterpropertiesset ของ BeintizingBean)
วิธีการ postprocessafterinitialization จะดำเนินการหลังจากการสร้างอินสแตนซ์คลาสและการฉีดตัวแปรของสมาชิกเสร็จสมบูรณ์และวิธีการเริ่มต้น (เช่นการเริ่มต้นเมธอด AfterPropertIesset ของ InitializingBean) จะถูกดำเนินการหลังจากนั้น
สรุป:
1. การเริ่มต้นอินสแตนซ์โพสต์โปรเซสเซอร์ส่วนใหญ่ใช้สำหรับการดำเนินการพร็อกซีบางอย่างในอินสแตนซ์ คุณสมบัติบางอย่างที่ใช้ AOP ในฤดูใบไม้ผลิจะถูกนำไปใช้ผ่านโพสต์โปรเซสเซอร์
2. การเริ่มต้นอินสแตนซ์โซ่โพสต์โปรเซสเซอร์เป็นหลายโพสต์โปรเซสเซอร์และจะมีปัญหากับลำดับการดำเนินการ คุณสามารถใช้อินเทอร์เฟซที่สั่งซื้อเพื่อระบุลำดับการดำเนินการของการโพสต์การประมวลผล อินเทอร์เฟซที่สั่งซื้อประกาศวิธี GetOrder ยิ่งค่าผลตอบแทนของวิธีการเล็กลงเท่าใดลำดับความสำคัญของการโพสต์และการดำเนินการก่อนหน้านี้ก็ยิ่งสูงขึ้นเท่านั้น
3. เมื่อเริ่มต้นโพสต์โปรเซสเซอร์โดยใช้อินเทอร์เฟซ BeanPostProcessor ขอแนะนำให้ใช้อินเตอร์เฟสที่สั่งซื้อและระบุลำดับความสำคัญ
4. ขอบเขตของโปรเซสเซอร์หลังนี้คือคอนเทนเนอร์ SpringIOC ปัจจุบันนั่นคือคอนเทนเนอร์ SpringIOC ที่มีการประกาศโพสต์โปรเซสเซอร์ สำหรับคอนเทนเนอร์ SpringIOC ที่มีโครงสร้างแบบลำดับชั้นห่วงโซ่โปรเซสเซอร์หลังจากการเริ่มต้นอินสแตนซ์ไม่ได้ดำเนินการบนอินสแตนซ์ที่เริ่มต้นโดยคอนเทนเนอร์อื่นแม้ว่าคอนเทนเนอร์ทั้งสองจะอยู่ในลำดับชั้นเดียวกัน
5. คลาสการใช้งานของการเริ่มต้นอินสแตนซ์โพสต์โปรเซสเซอร์จะต้องมีการประกาศเช่นเดียวกับถั่วที่มีการจัดการสปริงธรรมดา คอนเทนเนอร์ SpringIoc จะตรวจจับโดยอัตโนมัติและเพิ่มลงในห่วงโซ่การเริ่มต้นอินสแตนซ์โพสต์โปรเซสเซอร์
6. เมื่อเปรียบเทียบกับการตรวจจับอัตโนมัติเรายังสามารถเรียกวิธีการ AddBeanPostProcessor ของ ConfigureDableBeanFactory เพื่อเพิ่มการเริ่มต้นอินสแตนซ์ Postprocessor ไปยังห่วงโซ่โพสต์โปรเซสเซอร์อินสแตนซ์ สิ่งนี้เป็นประโยชน์มากขึ้นในสถานการณ์ที่จำเป็นต้องมีการเพิ่มเงื่อนไข วิธีการเขียนโปรแกรมนี้จะไม่สนใจคำสั่งที่ระบุโดยอินเทอร์เฟซที่สั่งซื้อที่นำไปใช้ แต่จะดำเนินการในทุกกรณีที่ตรวจพบโดยอัตโนมัติก่อนที่จะเริ่มต้นของโพสต์โปรเซสเซอร์
2.1.2 ถั่วเริ่มต้นโพสต์โปรเซสเซอร์และ AOP
BeanPostProcessor เป็นอินเทอร์เฟซพิเศษและชั้นเรียนที่ใช้อินเทอร์เฟซนี้จะถูกใช้เป็นตัวประมวลผล postprocessor สำหรับอินสแตนซ์ของถั่วที่มีการจัดการฤดูใบไม้ผลิ ดังนั้นในขั้นตอนพิเศษของการเริ่มต้นบริบทของแอปพลิเคชันฤดูใบไม้ผลิอินสแตนซ์ทั้งหมดที่ใช้อินเตอร์เฟส BeanPostProcessor จะเริ่มต้นโดยตรงและคลาสที่อ้างอิงโดยอินสแตนซ์จะถูกสร้างอินสแตนซ์ด้วย จากนั้นเป็นตัวประมวลผลหลังการใช้กับอินสแตนซ์ปกติอื่น ๆ
เนื่องจากพร็อกซีอัตโนมัติของ AOP ถูกนำไปใช้ในรูปแบบของการสร้างอินสแตนซ์โพสต์โปรเซสเซอร์อินสแตนซ์อินสแตนซ์ของถั่วจึงไม่เริ่มต้นอินสแตนซ์ของห่วงโซ่โพสต์โปรเซสเซอร์หรืออินสแตนซ์อ้างอิงสามารถพร็อกซีโดยอัตโนมัติได้ ดังนั้นอย่าสานต่อหน้าตัวอย่างเหล่านี้ (สำหรับอินสแตนซ์เหล่านี้ข้อความบันทึกจะถูกสร้างขึ้น: "คลาส FOO ไม่สามารถประมวลผลได้โดยโซ่ postprocessor ที่สร้างอินสแตนซ์ทั้งหมดเช่นไม่สามารถ proxyed โดยอัตโนมัติ")
หมายเหตุ: เมื่อ postprocessor อินสแตนซ์หมายถึงถั่วอื่น ๆ ในรูปแบบของ autowiring หรือ @Resource ภาชนะสปริงอาจฉีดถั่วที่ไม่ได้ระบุเมื่อมันถูกฉีดด้วยการพึ่งพาการจับคู่ประเภท ถูกฉีดในรูปแบบของการจับคู่ประเภทและถั่วที่ไม่ได้ระบุอาจถูกฉีดในเวลานี้) นอกจากนี้ยังสามารถทำให้เกิดพร็อกซ์อัตโนมัติหรือวิธีการอื่น ๆ ของการประมวลผล postprocessor อินสแตนซ์ที่จะล้มเหลว
2.1.3 ตัวอย่างการเริ่มต้นถั่วโพสต์โปรเซสเซอร์
Public Class BEANPOSTPROCESSORSERVICE ใช้ beanPostProcessor {@Override วัตถุสาธารณะ postprocessafterinitialization (Object O, String S) พ่น beansexception {system.out.println ("beanpostprocessorservice postprocessafterinitialization String S) พ่น beansexception {system.out.println ("beanpostprocessorservice postprocessialization วิธีการดำเนินการ ... "); return o;}}}2.2BeanFactoryPostProcessor อินเตอร์เฟส
2.2.1 postprocessor beanfactory
ด้วยการใช้อินเทอร์เฟซ BeanFactoryPostProcessor คุณสามารถอ่านข้อมูลเมตาการกำหนดค่าของถั่วที่จัดการโดยคอนเทนเนอร์และทำการเปลี่ยนแปลงก่อนที่ถั่วจะถูกสร้างอินสแตนซ์ ถั่วเหล่านี้เรียกว่า beanfactory postprocessors
ความเหมือนและความแตกต่างระหว่าง BeanFactoryPostProcessors และอินเตอร์เฟส BeanPostProcessor:
ความคล้ายคลึงกัน:
ทั้งหมดเป็น postprocessors ระดับคอนเทนเนอร์
ทั้งหมดสามารถกำหนดค่าได้ด้วยตัวประมวลผลหลาย postprocessors และคำสั่งดำเนินการถูกระบุโดยการใช้อินเทอร์เฟซที่สั่งซื้อ
พวกเขาจะถูกประมวลผลสำหรับถั่วที่จัดการในคอนเทนเนอร์ที่ประกาศโดยอินเทอร์เฟซ ในภาชนะบรรจุที่มีโครงสร้างแบบลำดับชั้นถั่วในภาชนะอื่น ๆ ไม่สามารถประมวลผลได้แม้ว่าตู้คอนเทนเนอร์ทั้งสองจะอยู่ในระดับเดียวกัน
พวกเขาทั้งหมดจะต้องมีการประกาศในภาชนะเช่นถั่วธรรมดา คอนเทนเนอร์จะตรวจจับและลงทะเบียนเป็น postprocessor โดยอัตโนมัติ
การกำหนดค่าคุณสมบัติการเริ่มต้นล่าช้าจะถูกละเว้น
ความแตกต่าง:
อินเทอร์เฟซ BeanFactoryPostProcessors ประมวลผลข้อมูลเมตาการกำหนดค่าของถั่วก่อนการสร้างอินสแตนซ์ของถั่วและอินเตอร์เฟส beanpostprocessor จะประมวลผลอินสแตนซ์ของถั่วหลังจากการสร้างอินสแตนซ์ของถั่ว **
อินเทอร์เฟซ BeanFactoryPostProcessors ยังสามารถรับอินสแตนซ์ของถั่วผ่านวิธี beanfactory.getBean () ซึ่งจะทำให้ถั่วเป็นอินสแตนซ์ เนื่องจาก postprocessor ของ beanfactorypostorsors ถูกดำเนินการก่อนที่ถั่วทั้งหมดจะได้รับการสร้างอินสแตนซ์, beanfactory.getBean () วิธีการจะทำให้ถั่วได้รับการสร้างอินสแตนซ์ล่วงหน้าดังนั้นการทำลายวงจรชีวิตของมาตรฐานคอนเทนเนอร์ซึ่งอาจทำให้เกิดผลกระทบเชิงลบ
2.2.2 สปริงในตัวและ postprocessor beanfactory ที่กำหนดเอง
ฤดูใบไม้ผลิมี postprocessors beanfactory ในตัว (ตัวอย่างเช่น: PropertyPlaceHolderConfigurer และ PropertyOverrideconFigurer) นอกจากนี้ยังรองรับการใช้งานอินเตอร์เฟสของ BeanFactoryPostProcessor และปรับแต่ง Postprocessor ของ BeanFactory มาพูดคุยกันเกี่ยวกับ postprocessors ในตัวของ Spring และ Postprocessors ที่กำหนดเอง
PropertyPlaceHolderConfigurer
เพื่อหลีกเลี่ยงความเสี่ยงที่เกิดจากการปรับเปลี่ยนไฟล์นิยาม XML หลักสปริงให้การแยกการกำหนดค่าและสามารถกำหนดค่าตัวแปรบางอย่างที่อาจเปลี่ยนเป็นไฟล์การกำหนดค่าคุณสมบัติและอ้างอิงในไฟล์นิยาม XML เป็นตัวยึด ด้วยวิธีนี้การแก้ไขการกำหนดค่าจะต้องมีการแก้ไขไฟล์การกำหนดค่าแอตทริบิวต์เท่านั้น PropertyPlaceHolderConfigurer ใช้เพื่อตรวจจับตัวยึดตำแหน่งและแทนที่ตัวยึดตำแหน่งด้วยค่าคุณสมบัติการกำหนดค่า ตัวอย่างมีดังนี้:
PropertyPlaceHolderConFigurer ใช้ไฟล์การกำหนดค่าคุณสมบัติ JDBC.Properties เพื่อแทนที่ Property Placeholder สำหรับข้อมูลที่เกี่ยวข้องกับฐานข้อมูลใน Bean DataSource ด้วยค่าการกำหนดค่าที่สอดคล้องกันที่รันไทม์
การกำหนดค่า XML มีดังนี้:
<Bean> <property name = "locations" value = "classpath: com/foo/jdbc.properties"/> </ebean> <bean id = "dataSource" destroy-method = "close"> <property name = "driverclassname" value = "$ {jdbc.driverclassname name = "username" value = "$ {jdbc.username}"/> <property name = "รหัสผ่าน" value = "$ {jdbc.password}"/>ไฟล์การกำหนดค่าแอตทริบิวต์ jdbc.properties มีดังนี้:
jdbc.driverclassName = org.hsqldb.jdbcdriverjdbc.url = jdbc: hsqldb: hsql: // การผลิต: 9002jdbc.username = sajdbc.password = root
PropertyPlaceHolderConfigurer ไม่เพียง แต่รองรับการอ่านไฟล์การกำหนดค่าคุณสมบัติ แต่ยังรองรับการอ่านคุณสมบัติของระบบ ลำดับความสำคัญของการอ่านสามารถกำหนดค่าผ่านค่าคุณสมบัติ SystemPropertiesMode ค่าต่าง ๆ มีการอธิบายดังนี้:
0: อย่าอ่านคุณสมบัติของระบบ
1: หากการกำหนดค่าสำหรับตัวยึดตำแหน่งที่สอดคล้องกันไม่ได้รับการเรียกคืนในไฟล์การกำหนดค่าแอตทริบิวต์อ้างอิงแอตทริบิวต์ของระบบจะถูกอ่าน ค่าเริ่มต้นคือ 1
2: อ่านแอตทริบิวต์ของระบบก่อนจากนั้นอ่านไฟล์การกำหนดค่าแอตทริบิวต์อ้างอิง การกำหนดค่านี้อาจทำให้คุณสมบัติของระบบเขียนทับไฟล์การกำหนดค่า
PropertyOverrideconFigurer
คลาส PropertyOverridEconFigurer สามารถกำหนดค่าโดยตรงให้กับถั่วในคอนเทนเนอร์โดยอ้างถึงไฟล์การกำหนดค่าคุณสมบัติ เมื่อคุณสมบัติของถั่วถูกกำหนดโดยอินสแตนซ์คลาส PropertyOverridEconFigurer หลายรายการค่าสุดท้ายจะแทนที่ค่าก่อนหน้านี้
การกำหนดถั่วแหล่งข้อมูลด้านบนเป็นตัวอย่าง:
คลาส PropertyOverridEconFigurer ใช้วิธีใหม่ในการอ้างอิงไฟล์การกำหนดค่าคุณสมบัติดังนี้:
<บริบท: Property-Override Location = "ClassPath: Override.properties"/>>
กฎการตั้งชื่อของคุณสมบัติของการแทนที่ไฟล์การกำหนดค่าคุณสมบัติ properties นั้นแตกต่างจากที่อยู่ด้านบน (ในตัวอย่างข้างต้นจำเป็นต้องตรวจสอบให้แน่ใจว่าชื่อทรัพย์สินและตัวยึดตำแหน่งมีความสอดคล้องกัน) และกฎการตั้งชื่อนั้นเป็นชื่อ Beanname.property
dataSource.DriverClassName = com.mysql.jdbc.driverdataSource.url = jdbc: mysql: mydbdatasource.username = sadataSource.password = root
รองรับการกำหนดแอตทริบิวต์คอมโพสิต แต่ทำให้มั่นใจได้ว่าวัตถุที่อ้างอิงแอตทริบิวต์ที่ได้รับมอบหมายไม่ว่างเปล่าตัวอย่างเช่น: foo.fred.bob.sammy = 123
Postprocessor จากโรงงานถั่ว
Postprocessor จากโรงงานถั่วที่กำหนดเองใช้อินเทอร์เฟซ BeanFactoryPostProcessor เพื่อทำการปรับเปลี่ยนข้อมูลเมตาการกำหนดค่าของถั่วที่จัดการโดยคอนเทนเนอร์ฤดูใบไม้ผลิ ตัวอย่างเช่น: แก้ไขค่าที่ฉีดด้วยแอตทริบิวต์คลาสตัวอย่างมีดังนี้:
กำหนดผู้ใช้คลาสผู้ใช้เบียน
UserBean คลาสสาธารณะ {Private String username; String สาธารณะ getUserName () {return username;} โมฆะสาธารณะ setUserName (ชื่อผู้ใช้สตริง) {this.userName = ชื่อผู้ใช้;}}}ไฟล์การกำหนดค่า Spring XML กำหนดค่าคลาสผู้ใช้และฉีดค่าฮ่าฮ่าไปยังชื่อผู้ใช้ชื่อผู้ใช้ชื่อผู้ใช้
<Bean/> <bean id = "ผู้ใช้"> <property name = "ชื่อผู้ใช้" value = "haha"/> </epean>
ด้านล่างเป็น postprocessor จากโรงงานถั่วที่กำหนดเองปรับเปลี่ยนค่าของชื่อผู้ใช้ทรัพย์สินเป็น heihei
ระดับสาธารณะ beanfactorypostprocessorservice ใช้ beanfactorypostprocessor {@Override โมฆะสาธารณะ postprocessbeanfactory (configurableListableBeanfactory beanfactory) โยน beansexception {system.out.println ("beanfactoryprocessorservice beandefinition bd = beanfactory.getBeanDefinition ("ผู้ใช้"); MutablePropertyValues pv = bd.getPropertyValues (); if (pv.contains ("ชื่อผู้ใช้")) {pv.addpropertyvalue ("ชื่อผู้ใช้", "heihei"); -สรุป
ข้างต้นเป็นคำอธิบายโดยละเอียดทั้งหมดของการเรียกกลับวัฏจักรชีวิตฤดูใบไม้ผลิและส่วนขยายคอนเทนเนอร์ในบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงเว็บไซต์นี้ต่อไปได้:
การอภิปรายสั้น ๆ เกี่ยวกับการประยุกต์ใช้คำอธิบายประกอบที่กำหนดเองในฤดูใบไม้ผลิ
การวิเคราะห์รหัส IOC ของฤดูใบไม้ผลิ
ตัวอย่างรหัสการใช้งานตัวจัดการสปริง MVC Interceptor
หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!