คำนำ
คอนเทนเนอร์ IOC ของฤดูใบไม้ผลินั้นทรงพลังมากรับผิดชอบในการสร้างและการจัดการถั่วของฤดูใบไม้ผลิและฟังก์ชั่นอื่น ๆ ถั่วฤดูใบไม้ผลิเป็นส่วนสำคัญของแอปพลิเคชันฤดูใบไม้ผลิทั้งหมด การทำความเข้าใจวงจรชีวิตของถั่วฤดูใบไม้ผลิจะช่วยให้เราเข้าใจกรอบฤดูใบไม้ผลิทั้งหมด
BeanFactory และ ApplicationContext เป็นสองคอนเทนเนอร์สำคัญของฤดูใบไม้ผลิ อดีตให้การสนับสนุนขั้นพื้นฐานที่สุดสำหรับการฉีดพึ่งพาในขณะที่หลังขยายฟังก์ชั่นของมันขึ้นอยู่กับการสืบทอดในอดีตเช่นการเพิ่มฟังก์ชั่นเช่นการแพร่กระจายเหตุการณ์การเข้าถึงทรัพยากรและการเข้าถึงข้อความระหว่างประเทศ บทความนี้ส่วนใหญ่แนะนำวงจรชีวิตของถั่วในสองคอนเทนเนอร์ ApplicationContext และ Beanfactory
ก่อนอื่นดูแผนภูมิวงจรชีวิต:
มาพูดถึงวงจรชีวิตก่อนที่เราจะพูดถึงเรื่องนี้:
ฤดูใบไม้ผลิจะช่วยให้เราจัดการวงจรชีวิตเต็มรูปแบบของถั่วโมเดลซิงเกิล สำหรับถั่วต้นแบบสปริงจะไม่จัดการวงจรชีวิตที่ตามมาอีกต่อไปหลังจากที่พวกเขาถูกสร้างและส่งมอบให้กับผู้ใช้
วิธีการอธิบายประกอบ
มีหลายขั้นตอนเมื่อเริ่มต้นถั่ว ก่อนอื่นคุณสามารถใช้คำอธิบายประกอบ @postconstruct และ @predestroy เพื่อเรียกมันในขั้นตอนการสร้างและทำลายของถั่ว:
@ComponentPublic Class AnnotationBean {ส่วนตัว Logger Logger คงที่สุดท้าย = loggerFactory.getLogger (AnnotationBean.class); @PostConstruct โมฆะสาธารณะเริ่มต้น () {logger.info ("AnnotationBean Start"); } @Predestroy โมฆะสาธารณะทำลาย () {logger.info ("คำอธิบายประกอบการทำลาย"); -เริ่มต้นเบียน
นอกจากนี้คุณยังสามารถใช้อินเทอร์เฟซทั้งสองของการเริ่มต้นเบียนและ disposablebean ซึ่งเรียกว่าในระหว่างขั้นตอนการเริ่มต้นและการทำลายล้าง:
@ServicePublic Class Springlifecycleservice ใช้การเริ่มต้นเบียน, disposableBean {ส่วนตัว logger logger สุดท้ายคงที่ = loggerFactory.getLogger (Springlifecycleservice.class); @Override โมฆะสาธารณะ AfterPropertIesset () โยนข้อยกเว้น {logger.info ("Springlifecycleservice Start"); } @Override โมฆะสาธารณะทำลาย () โยนข้อยกเว้น {logger.info ("Springlifecycleservice ทำลาย"); -การเริ่มต้นและวิธีการทำลายล้างแบบกำหนดเอง
นอกจากนี้คุณยังสามารถปรับแต่งวิธีการโทรระหว่างขั้นตอนการเริ่มต้นและการทำลายล้าง:
@ConfigurationPublic คลาส LifecycleConfig {@Bean (initMethod = "Start", DestroyMethod = "Destroy") Public Springlifecycle สร้าง () {Springlifecycle Springlifecycle = New Springlifecycle (); กลับ Springlifecycle; }} คลาสสาธารณะ Springlifecycle {ส่วนตัว Logger คงที่สุดท้าย logger = loggerFactory.getLogger (Springlifecycle.class); โมฆะสาธารณะเริ่มต้น () {logger.info ("Springlifecycle Start"); } โมฆะสาธารณะทำลาย () {logger.info ("Springlifecycle ทำลาย"); -ข้างต้นได้รับการกำหนดค่าใน Springboot ด้วยวิธีนี้และสามารถใช้งานได้หากเป็น XML แบบดั้งเดิม:
<Bean Init-method = "start" destroy-method = "Destroy"> </ebean>
เพื่อให้ได้ผลเดียวกัน
ใช้งาน *AWARE Interface
*การรับรู้อินเทอร์เฟซสามารถใช้เพื่อรับวัตถุบางอย่างในฤดูใบไม้ผลิเมื่อเริ่มต้นถั่วเช่นการได้รับบริบทสปริง
@ComponentPublic Class SpringlifecyCleaware ใช้ ApplicationContextAware {ส่วนตัว Logger Logger สุดท้ายคงที่ = loggerFactory.getLogger (SpringlifecyCleaware.class); ApplicationContext Private ApplicationContext; @Override โมฆะสาธารณะ setApplicationContext (ApplicationContext ApplicationContext) พ่น beansexception {this.applicationContext = ApplicationContext; logger.info ("Springlifecycleaware เริ่มต้น"); -ด้วยวิธีนี้วิธี setApplicationContext จะถูกเรียกในการเริ่มต้นของถั่ว SpringlifecyCleaware และวัตถุ ApplicationContext สามารถรับได้
โปรเซสเซอร์ที่ปรับปรุงแล้ว beanpostprocessor
ใช้อินเทอร์เฟซ BeanPostProcessor ถั่วทั้งหมดในฤดูใบไม้ผลิจะเรียกสองวิธีในอินเทอร์เฟซเมื่อเริ่มต้นซึ่งสามารถใช้ในการประมวลผลถั่วพิเศษบางอย่าง:
@ComponentPublic Class SpringlifecycleProcessor ใช้ beanPostProcessor {ส่วนตัว logger logger คงที่สุดท้าย = loggerFactory.getLogger (SpringlifecycleProcessor.class); / ** * เรียกว่าก่อนการเริ่มต้นก่อน * @param Bean * @param beanname * @return * @throws beansexception */ @Override วัตถุสาธารณะ postprocessbeforeinitialization (Object Bean, String Beanname) โยน beansexception BeanName = {} ", BeanName); } return bean; } / ** * โพสต์-initialization การเริ่มต้นถั่วการเริ่มต้นการโทรที่สมบูรณ์ * @param bean * @param beanname * @return * @throws beansexception * / @Override วัตถุสาธารณะ postprocessafterinitialization (object bean, string beanname) logger.info ("SpringlifecycleProcessor End BeanName = {}", BeanName); } return bean; -ผลการสังเกตหลังจากการดำเนินการ:
018-03-21 00: 40: 24.856 [รีสตาร์ทเมน] ข้อมูล ccspspringlifecycleprocessor-SpringlifecycleProcessor เริ่มต้น Beanname = AnnotationBean2018-03-21 00: 40: 24.860 00: 40: 24.861 [retartedmain] ข้อมูล ccspspringlifecycleprocessor-Springlifecycleprocessor End Beanname = AnnotationBean2018-03-21 00: 40: 24.864 00: 40: 24.867 [รีสตาร์ทเมน] ข้อมูล ccspring.springlifecycleservice-Springlifecycleservice start2018-03-21 00: 40: 24.887 [retartedmain] info ccspring.Springlifecycle OSBDAOPTIONALLIVERELOADSERVER-เซิร์ฟเวอร์ LiverEload กำลังทำงานบนพอร์ต 357292018-03-21 00: 40: 25.122 [รีสตาร์ทเมน] ข้อมูล osjeaannotationMbeanExporter-การลงทะเบียนถั่วสำหรับการเปิดรับ JMX แอปพลิเคชันใน 2.309 วินาที (JVM ทำงานสำหรับ 3.681) 2018-03-21 00: 40: 25.143 [รีสตาร์ทเมน] ข้อมูล com.crossoverjie.Application-เริ่มตกลง! 2018-03-21 00: 40: 25.153 org.springframework.context.annotation.annotationConfigapplicationContext@3913Adad: วันที่เริ่มต้น [พุธ 21 มี.ค. 00:40:23 CST 2018]; รากของบริบท Hierarchy2018-03-21 00: 40: 25.155 [เธรด -8] ข้อมูล osjeaannotationmbeanexporter-การไม่ลงทะเบียนถั่ว jmx ที่สัมผัสกับ shutdown2018-03-21 00: 40: 25.156 00: 40: 25.156 [Thread-8] info ccservice.springlifecycleservice-Springlifecycleservice Destroy2018-03-21 00: 40: 25.156 [Thread-8] ข้อมูล ccspring.annotation.annotationbean
จนกระทั่งบริบทของฤดูใบไม้ผลิถูกทำลายวิธีการทำลายแบบกำหนดเองและวิธีการทำลาย () ที่ใช้งาน DisposableBean จะถูกเรียก
สรุป
ข้างต้นคือวงจรชีวิตถั่วฤดูใบไม้ผลิที่แนะนำโดยบรรณาธิการ ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับทุกคนในเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!