ในฐานะที่เป็นเฟรมเวิร์กน้ำหนักเบาที่ได้รับความนิยมและทรงพลังที่สุดใน Java ฤดูใบไม้ผลิได้รับการต้อนรับอย่างอบอุ่นจากโปรแกรมเมอร์ จำเป็นอย่างยิ่งที่จะต้องเข้าใจวงจรชีวิตของถั่วฤดูใบไม้ผลิอย่างแม่นยำ เรามักจะใช้ ApplicationContext เป็นคอนเทนเนอร์สปริง ที่นี่เรากำลังพูดถึงวงจรชีวิตของถั่วใน ApplicationContext ในความเป็นจริง Beanfactory นั้นคล้ายคลึงกัน แต่โปรเซสเซอร์จะต้องลงทะเบียนด้วยตนเอง
1. แผนภูมิการไหลของวงจรชีวิต:
วงจรชีวิตเต็มรูปแบบของถั่วฤดูใบไม้ผลิเริ่มต้นด้วยการสร้างภาชนะสปริงจนกระทั่งภาชนะฤดูใบไม้ผลิในที่สุดทำลายถั่วซึ่งมีชุดของจุดสำคัญ
หากคอนเทนเนอร์ลงทะเบียนอินเทอร์เฟซต่าง ๆ ข้างต้นโปรแกรมจะดำเนินการตามกระบวนการข้างต้น ฟังก์ชั่นของแต่ละอินเตอร์เฟสจะอธิบายรายละเอียดด้านล่าง
2. การจำแนกประเภทของวิธีการอินเตอร์เฟสต่างๆ
วงจรชีวิตเต็มรูปแบบของถั่วผ่านการเรียกวิธีการต่าง ๆ ซึ่งสามารถแบ่งออกเป็นหมวดหมู่ต่อไปนี้:
1. วิธีการของถั่วเอง: รวมถึงวิธีการที่เรียกโดยถั่วเองและวิธีการที่ระบุผ่านวิธีการเริ่มต้นและการทำลายวิธีการในไฟล์การกำหนดค่า
2. วิธีการเชื่อมต่อวงจรชีวิตระดับถั่ว: ซึ่งรวมถึงวิธีการเชื่อมต่อเช่น Beannameaware, BeanFactoryAware, InitializingBean และ DiposableBean
3. วิธีการเชื่อมต่อวงจรชีวิตระดับคอนเทนเนอร์: ซึ่งรวมถึงการใช้งานอินเตอร์เฟสสองแบบ: InstantiationawareBeanPostProcessor และ BeanPostProcessor โดยทั่วไปคลาสการใช้งานของพวกเขาเรียกว่า "postprocessor"
4. วิธีการอินเตอร์เฟสโรงงาน Postprocessor: ซึ่งรวมถึง APPERITHJWEAVENTENABLER, ConfigurationClassPostProcessor, CustomAutowireConfigurer และวิธีการเชื่อมต่อโพสต์โปรเซสเซอร์โรงงานอื่น ๆ ที่มีประโยชน์อื่น ๆ เครื่องประมวลผลโรงงานเป็นระดับคอนเทนเนอร์ เรียกทันทีหลังจากใช้ไฟล์การกำหนดค่าแอสเซมบลีบริบท
3. การสาธิต
มาสาธิตวงจรชีวิตของถั่วฤดูใบไม้ผลิด้วยถั่วฤดูใบไม้ผลิที่เรียบง่าย
1. ก่อนอื่นมันเป็นถั่วสปริงที่เรียบง่ายซึ่งเรียกวิธีการของถั่วและวิธีการเชื่อมต่อวงจรชีวิตระดับถั่ว เพื่อความสะดวกในการสาธิตมันใช้สี่อินเตอร์เฟส: Beannameaware, BeanFactoryAware, InitializingBean และ DiposableBean มี 2 วิธีในเวลาเดียวกันสอดคล้องกับวิธีการเริ่มต้นและการทำลายวิธี <bean> ในไฟล์การกำหนดค่า ดังนี้:
แพ็คเกจ SpringBeantest; นำเข้า org.springframework.beans.beansexception; นำเข้า org.springframework.beans.factory.beanfactory; นำเข้า org.springframework.beans.factory.beanfactoryaware; org.springframework.beans.factory.disposablebean; นำเข้า org.springframework.beans.factory.initializingBean;/** * @author Qsk */บุคคลชั้นเรียนสาธารณะ ที่อยู่สตริงส่วนตัว โทรศัพท์ INT ส่วนตัว; Beanfactory Private Beanfactory; สตริงส่วนตัว Beanname; บุคคลสาธารณะ () {System.out.println ("【 constructor 】การสร้างอินสแตนซ์คอนสตรัคเตอร์ของบุคคลโทร"); } สตริงสาธารณะ getName () {ชื่อคืน; } โมฆะสาธารณะ setName (ชื่อสตริง) {system.out.println ("【แอตทริบิวต์การฉีด】ชื่อแอตทริบิวต์การฉีด"); this.name = ชื่อ; } สตริงสาธารณะ getAddress () {return address; } โมฆะสาธารณะ setAddress (ที่อยู่สตริง) {system.out.println ("【แอตทริบิวต์การฉีด】ที่อยู่การฉีดแอตทริบิวต์"); this.address = ที่อยู่; } public int getphone () {return phone; } โมฆะสาธารณะ setphone (int phone) {system.out.println ("【แอตทริบิวต์การฉีด】แอตทริบิวต์การฉีดโทรศัพท์"); this.phone = โทรศัพท์; } @Override สตริงสาธารณะ toString () {return "person [address =" + address + ", name =" + name + ", phone =" + phone + "]"; } // นี่คือวิธีการเชื่อมต่อ beanfactoryaware @Override โมฆะสาธารณะ setBeanFactory (beanfactory arg0) พ่น beansexception {system.out .println ("【 interface beanfactoryaware this.beanfactory = arg0; } // นี่คือวิธีการอินเตอร์เฟส BeannameAwer @Override โมฆะสาธารณะ setBeanName (String arg0) {System.out.println ("【 Beannameaware Interface 】 call beannameaware.setBeanName ()"); this.beanname = arg0; } // นี่คือวิธีการเริ่มต้นเบียน @Override โมฆะสาธารณะ AfterPropertIesset () พ่นข้อยกเว้น {System.out .println ("【 interface InitializingBean 】การเริ่มต้นการเริ่มต้นเบียน } // นี่คือวิธีอินเตอร์เฟส diposibleBean @Override โมฆะสาธารณะทำลาย () โยนข้อยกเว้น {system.out.println ("【 diposibleBean อินเตอร์เฟส】เรียก diposiblebean.destory ()"); } // วิธีการเริ่มต้นที่ระบุผ่านคุณสมบัติ init-method ของ <ebean> โมฆะสาธารณะ myinit () {system.out.println ("【 init-method 】เรียกวิธีการเริ่มต้นที่ระบุโดยคุณสมบัติเริ่มต้นของ <bean>"); } // วิธีการเริ่มต้นที่ระบุโดยคุณสมบัติการทำลาย-วิธีการของ <bean> โมฆะสาธารณะ myDestory () {system.out.println ("【ทำลาย-วิธีการเรียกใช้วิธีการเริ่มต้นที่ระบุโดยคุณสมบัติการทำลายของ <bean>"); -2. ถัดไปคือการแสดงวิธีการของอินเทอร์เฟซ BeanPostProcessor ดังต่อไปนี้:
แพ็คเกจ SpringBeantest; นำเข้า org.springframework.beans.beansexception; นำเข้า org.springframework.beans.factory.config.beanpostprocessor; คลาสสาธารณะ mybeanpostprocessor ใช้ beanpostprocessor System.out.println ("นี่คือตัวสร้างคลาสการใช้งาน BeanPostProcessor !!"); // todo todo ที่สร้างขึ้นใหม่ stub stub} @Override วัตถุสาธารณะ postprocessafterinitialization (Object Arg0, String arg1) พ่น beansexception {system.out .println ("beanpostprocessor method method postprocessafterinitialization ทำให้การเปลี่ยนแปลงของคุณสมบัติ!"); กลับ arg0; } @Override วัตถุสาธารณะ postprocessbeforeinitialization (Object Arg0, String arg1) พ่น beansexception {system.out .println ("BeanPostProcessor Method Method Method Postprocessialization เปลี่ยนคุณสมบัติ!"); กลับ arg0; -ดังที่ได้กล่าวไว้ข้างต้นอินเตอร์เฟส BeanPostProcessor รวมถึงสองวิธีหลังการกำหนดค่าและโพสต์โปรเซสเซอร์ก่อนกำหนด พารามิเตอร์แรกของสองวิธีนี้คือวัตถุถั่วที่จะประมวลผลและพารามิเตอร์ที่สองคือชื่อของถั่ว ค่าส่งคืนยังเป็นวัตถุถั่วที่จะประมวลผล ให้ความสนใจที่นี่
3. อินเทอร์เฟซ InstantiationawareBeanPostProcessor เป็นหลักของการใช้งานย่อยของ BeanPostProcessor โดยทั่วไปเราสืบทอดอะแดปเตอร์ InstantiationawareBeanPostProcessor ของคลาสอะแดปเตอร์
แพ็คเกจ SpringBeantest; นำเข้า java.beans.propertydescriptor; นำเข้า org.springframework.beans.beansexception; นำเข้า org.springframework.beans.propertyvalue; MyinstantiationawareBeanPostProcessor ขยาย InstantiationawareBeanPostProcessorAdapter {สาธารณะ myinstantiationawareBeanPostProcessor () {super (); System.out .println ("นี่คือ InstantiationawareBeanPostProcessorAdapter constructor การใช้งานคลาส !!"); } // โทร @Override วัตถุสาธารณะ postprocessbeforeinstantiation (คลาส Beanclass, String beanname) พ่น beansexception {system.out .println ("InstantiationawareBeanPostProcessor เรียกวิธีการ postprocessbeforeinstantiation"); คืนค่า null; } // เมธอดอินเตอร์เฟสโทร @Override วัตถุสาธารณะ postprocessafterinitialization (Object Bean, String Beanname) พ่น beansexception {system.out .println ("InstantiationawareBeanPostProcessor เรียกวิธีการ postprocessafterinitialization"); คืนถั่ว; } // โทร @Override Public PropertyValues PostprocessPropertyValues (PropertyValues PVS, PropertyDescriptor [] PDS, Object Bean, String Beanname) พ่น beansexception {System.out .println ( กลับ PVS; -มี 3 วิธีสำหรับสิ่งนี้และวิธีที่สอง postprocessafterinitialization คือการเขียนวิธีการของ beanpostprocessor ใหม่ วิธีที่สามคือ PostprocessPropertyValues ใช้ในการใช้งานคุณสมบัติและค่าส่งคืนควรเป็นวัตถุ PropertyValues
4. แสดงวิธีการเชื่อมต่อของโรงงานโพสต์โปรเซสเซอร์ดังต่อไปนี้:
แพ็คเกจ SpringBeantest; นำเข้า org.springframework.beans.beansexception; นำเข้า org.springframework.beans.factory.config.beandefinition; นำเข้า org.springframework.beans.factory.config.beanfactoryprocessor; org.springframework.beans.factory.config.configurableListablebeanfactory; คลาสสาธารณะ MyBeanFactoryPostProcessor ใช้ beanfactorypostprocessor {สาธารณะ myBeanFactoryPostProcessor () {super (); System.out.println ("นี่คือตัวสร้างคลาสการใช้งาน beanfactorypostprocessor ตัวสร้าง !!"); } @Override โมฆะสาธารณะ postprocessBeanFactory (configurableListableBeanFactory arg0) พ่น beansexception {system.out .println ("beanfactorypostprocessor เรียกวิธีการ postprocessbeanfactory"); beandefinition bd = arg0.getBeanDefinition ("บุคคล"); bd.getPropertyValues (). addPropertyValue ("โทรศัพท์", "110"); -5. ไฟล์การกำหนดค่ามีดังนี้ beans.xml ซึ่งง่ายมาก เมื่อใช้ ApplicationContext โปรเซสเซอร์ไม่จำเป็นต้องลงทะเบียนด้วยตนเอง:
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://ww.w3.org/2001/xml xmlns: p = "http://www.springframework.org/schema/p" xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: tx = "http:/ XSI: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd" id = "InstantiationawareBeanPostProcessor"> </epean> <Bean ID = "BeanFactoryPostProcessor"> </epean> <Bean ID = "Person" Init-Method = "MyInit" Destroy-Method = "MyDestory" Scope = "Singleton" P: Name = "Zhang San /> </ebeans>
6. ทดสอบสิ่งต่อไปนี้:
แพ็คเกจ SpringBeantest; นำเข้า org.springframework.context.applicationContext; นำเข้า org.springframework.context.support.classpathxmlapplicationcontext; ApplicationContext Factory = ใหม่ classpathxmlapplicationContext ("SpringBeantest/Beans.xml"); System.out.println ("การเริ่มต้นคอนเทนเนอร์สำเร็จ"); // รับ presson และใช้บุคคล = factory.getBean ("person", person.class); System.out.println (บุคคล); System.out.println (บุคคล); System.out.println ("เริ่มปิดคอนเทนเนอร์ทันที!"); ((classpathxmlapplicationContext) โรงงาน) .registershutdownhook (); -ปิดคอนเทนเนอร์โดยใช้วิธี Hook ที่เป็น AbstractApplicationContext จริง
มาดูผลลัพธ์:
เริ่มต้นการเริ่มต้นคอนเทนเนอร์ตอนนี้ 2014-5-18 15:46:20 org.springframework.context.support.abstractapplicationContext ข้อมูลการเตรียมการ: การรีเฟรช org.springframework.context.support.classPathxmlapplicationContext@19A0C7C รากของบริบทลำดับชั้น 2014-5-18 15:46:20 org.springframework.beans.factory.xml.xmlbeanDefinitionReader LoadBeanDefinitions: การโหลดคำจำกัดความของการใช้งาน XML - BeanFactoryPostProcessor เรียกวิธี PostprocessBeanFactory วิธีนี้คือตัวสร้างคลาสการใช้งาน BEANPOSTPROCESTOR! - นี่คือ InstantiationawareBeanPostProcessorAdapter Constructor Constructor! - 2014-5-18 15:46:20 org.springframework.beans.factory.support.defaultlistablebeanfactory preinstantiatesingletonsinformation: singletons pre-instantiating ใน org.springframework.beans.factory.support.support.defaultlistory [BeanpostProcessor, InstantiationawareBeanPostProcessor, BeanFactoryPostProcessor, บุคคล]; รากของ HierarchyInstantiationAwareBeanPostProcessor วิธีการ postprocessbeforeinstantiation [constructor] call person Instructor Instructor InfantiationawareBeanPostprocessor การเรียกใช้วิธีการฉีดแอทพลิเคชันการฉีดแอตทริบิวต์ การเรียก beannameaware.setBeanName () [Interface BeanFactoryAware] การเรียก beanfactoryaware.setBeanFactory () BeanPostProcessor Interface Method Method Method PostprocessBoforeInitialization เปลี่ยนคุณลักษณะ! [InitializingBean Interface] Call InitializingBean.AfterPropertIesset () [init-method] เรียกใช้วิธีการเริ่มต้นที่ระบุโดยคุณสมบัติเริ่มต้นของ <bean>, วิธีการอินเตอร์เฟส beanPostProcessor วิธีการหลังการกำหนดคุณสมบัติเพื่อเปลี่ยนคุณสมบัติ! InstantiationawareBeanPostProcessor เรียกวิธีการ postprocessafterinitialization คอนเทนเนอร์เริ่มต้นได้สำเร็จ บุคคล [ที่อยู่ = กวางโจวชื่อ = จางซาน, โทรศัพท์ = 110] ตอนนี้เริ่มปิดคอนเทนเนอร์! 【 DostibleBean Interface 】เรียก diposiblebean.destory () 【ทำลายวิธีการเรียกใช้วิธีการเริ่มต้นที่ระบุโดยคุณสมบัติการทำลาย-วิธีการของ <bean>
ข้างต้นเป็นการรวบรวมข้อมูลเกี่ยวกับวงจรชีวิตของถั่วสปริงชวา เราจะยังคงเพิ่มข้อมูลที่เกี่ยวข้องในอนาคต ขอบคุณสำหรับการสนับสนุนเว็บไซต์นี้!