เจาะลึก SpringApplication.run() เบื้องหลังการทำงาน
สำรวจกลไกภายในเมื่อเรียกใช้งาน SpringApplication.run() ใน Spring Boot ตั้งแต่การกำหนดประเภทแอปพลิเคชันไปจนถึงการพร้อมรับทราฟฟิก

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
- การเปิดใช้งานแอปพลิเคชัน Spring Boot มีทั้งแบบใช้วิธี Static และแบบ Manual Instantiation
- กระบวนการทำงานภายในมีการตรวจสอบ WebApplicationType และโหลด Initializers ผ่าน SpringFactoriesLoader
- มีการเตรียม Environment, พิมพ์ Banner, และสร้าง ApplicationContext ก่อนเริ่มคอนเทนเนอร์
- ขั้นตอนสุดท้ายเรียกใช้ ApplicationRunner และเตรียมพร้อมรับทราฟฟิกเมื่อแอปพลิเคชันพร้อม
การเริ่มต้นทำงานของแอปพลิเคชัน Spring Boot ทุกตัวมักจะมีจุดเริ่มต้นที่คล้ายคลึงกัน โดยนักพัฒนาซอฟต์แวร์สามารถเลือกวิธีการเปิดใช้งานได้ถึงสองรูปแบบที่แตกต่างกันตามความต้องการในการปรับแต่งค่าตั้งต้นของระบบ โดยวิธีแรกคือการใช้เมธอดแบบ Static ซึ่งพบได้ถึง 95% ของกรณีการใช้งานทั่วไป และอีกวิธีคือการสร้างอินสแตนซ์แบบ Manual เมื่อจำเป็นต้องปรับแต่งค่าก่อนการรันระบบ
การสร้างอินสแตนซ์แบบ Manual ผ่านคลาส SpringApplicationBuilder จะมีประโยชน์อย่างมากในกรณีที่นักพัฒนาต้องการสร้างลำดับชั้นของคอนเทนเนอร์แบบแม่ลูก (Parent-Child Context Hierarchy) ซึ่งมักถูกนำไปใช้ใน Spring Cloud สำหรับ Bootstrap Context และในสถานการณ์การทดสอบระบบต่างๆ เพื่อให้การจัดการคอนเทนเนอร์มีความยืดหยุ่นสูงสุดตามเงื่อนไขที่กำหนด
เมื่อกระบวนการเริ่มต้นทำงานถูกเรียกใช้ ระบบจะดำเนินขั้นตอนสำคัญเบื้องหลังตามลำดับ โดยเริ่มต้นจากการวิเคราะห์ประเภทของแอปพลิเคชัน (WebApplicationType) ตามด้วยการโหลด ApplicationContextInitializers และ ApplicationListeners ผ่านทาง SpringFactoriesLoader ซึ่งทำหน้าที่อ่านค่าการตั้งค่าจากไฟล์ META-INF/spring.factories ของเฟรมเวิร์ก

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
ในส่วนของการจัดการอีเวนต์และการตั้งค่าคอนเทนเนอร์ ระบบจะมี BootstrapContext ซึ่งทำหน้าที่เป็นคอนเทนเนอร์สำหรับเก็บออบเจ็กต์ที่จำเป็นต้องใช้งานก่อนที่ ApplicationContext จะถูกสร้างขึ้นจริง โดยมันจะคงอยู่ตั้งแต่เริ่มต้นเมธอด run() จนกระทั่งคอนเทนเนอร์พร้อมใช้งาน เพื่อใช้ในการลงทะเบียนบีนในช่วงเริ่มต้น เช่น EnvironmentPostProcessor
กลไกภายในของ Spring Boot ถูกออกแบบมาให้มีความเป็นโมดูลสูง การทำความเข้าใจขั้นตอนเบื้องหลังตั้งแต่การเตรียม Environment ไปจนถึงการเรียกใช้งาน ApplicationRunner ช่วยให้นักพัฒนาสามารถปรับแต่งพฤติกรรมของแอปพลิเคชันในระดับลึกได้ดีขึ้น เช่น การดึงค่าความลับจากระบบภายนอกหรือการจัดการสถานะความพร้อมของเซิร์ฟเวอร์ก่อนเปิดรับทราฟฟิกจริง
ขั้นตอนถัดมาในลำดับการทำงานของ Spring Boot 3.x จะประกอบด้วยการเตรียมสภาพแวดล้อม (prepareEnvironment) การพิมพ์แบนเนอร์ (printBanner) การสร้างคอนเทนเนอร์ (createApplicationContext) และการรีเฟรชคอนเทนเนอร์ (refreshContext) เพื่อเริ่มต้นใช้งาน Spring Container อย่างเต็มรูปแบบ
ในช่วงท้ายของกระบวนการ เมื่อมาถึงขั้นตอน ApplicationStartedEvent ระบบจะถือว่าแอปพลิเคชันได้เริ่มต้นขึ้นแล้วแต่ยังไม่พร้อมรับทราฟฟิก จนกระทั่งเข้าสู่ขั้นตอนการเรียกใช้ ApplicationRunner และ CommandLineRunner พร้อมกับการเผยแพร่ ApplicationReadyEvent และ ReadinessState ที่บ่งบอกว่าแอปพลิเคชันพร้อมที่จะรับคำขอจากผู้ใช้งานจริงแล้ว
ที่มา: Dev.to
พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้
ความคิดเห็น
แสดงความคิดเห็น