1. คำนำ
ฉันเรียนสปริงบูตมาระยะหนึ่งแล้ว ฉันจะจัดงานวิจัยของฉันและแบ่งปันกับคุณเมื่อเร็ว ๆ นี้ จะมีบล็อกประมาณ 10 ถึง 20 บล็อก ซีรีส์ทั้งหมดจะขึ้นอยู่กับระบบบล็อกอย่างง่ายเพราะมันไม่ง่ายเลยที่จะเข้าใจเพียงแค่พูดคุยเกี่ยวกับทฤษฎีและหากคุณไม่สามารถเข้าใจจุดความรู้บางอย่างอย่างเป็นระบบทุกครั้งผ่านโปรแกรมมินิแบบง่าย ๆ นอกเหนือจากจุดความรู้พื้นฐานของการบูตฤดูใบไม้ผลิซีรี่ส์นี้ยังเกี่ยวข้องกับการรวมกันของการบูตฤดูใบไม้ผลิกับฐานข้อมูลแคช (Redis) คิวข้อความ ฯลฯ รวมถึงการปรับใช้หลายอินสแตนซ์ นักเรียนที่สนใจสามารถให้ความสนใจ
2. บทนำสู่สปริงบูต
สปริงบูตสามารถมองเห็นได้จากชื่อที่ขึ้นอยู่กับฤดูใบไม้ผลิดังนั้นนักเรียนที่ไม่คุ้นเคยกับฤดูใบไม้ผลิควรเรียนรู้เกี่ยวกับฤดูใบไม้ผลิก่อน ประการที่สอง Spring Boot ช่วยให้เรารวมฟังก์ชั่นที่ใช้กันทั่วไปจำนวนมากทำให้การกำหนดค่าทั้งหมดง่ายขึ้น นักเรียนที่ใช้ฤดูใบไม้ผลิควรรู้ว่าแม้ว่าฤดูใบไม้ผลิจะทำงานอย่างหนักเพื่อลดความซับซ้อนของการกำหนดค่า แต่ก็ยังค่อนข้างลำบากในการกำหนดค่าสภาพแวดล้อม (เว็บ) ที่มีอยู่อย่างเต็มที่เช่นการกำหนดค่าบันทึกฐานข้อมูลแคช ฯลฯ จากนั้นกำหนดค่า Tomcat และเผยแพร่โปรแกรมไปยังไดเรกทอรี Tomcat Spring Boot ทำให้กระบวนการนี้ง่ายขึ้นอย่างมาก มันมีผู้เริ่มต้นมากมายเพียงแค่แนะนำแพ็คเกจ JAR ที่เกี่ยวข้อง ตัวอย่างเช่นเราจำเป็นต้องรวม Tomcat เพียงแนะนำผู้เริ่มต้นของ Tomcat:
<การพึ่งพา> <roupId> org.springframework.boot </roupId> <ratifactid> Spring-Boot-Starter-Tomcat </artifactid>
หมายเหตุ: ตัวอย่างในบทความนี้ทั้งหมดขึ้นอยู่กับ Maven ดังนั้นหากคุณไม่คุ้นเคยกับ Maven คุณสามารถดูวิธีการใช้งานได้ก่อน หากคุณคุ้นเคยกับ Gradle คุณสามารถทำการปรับเปลี่ยนการกำหนดค่าที่สอดคล้องกันตามสถานการณ์
เราสามารถดูสตาร์ทเตอร์ที่จัดทำโดย Spring Boot จากเอกสารอย่างเป็นทางการ:
ที่นี่ฉันสกัดกั้นส่วนเล็ก ๆ เท่านั้นและคุณจะเห็นว่า Spring Boot รองรับการแคช, การประมวลผลแบบแบตช์, MQ, ES ฯลฯ สำหรับรายการที่สมบูรณ์โปรดดูเอกสารอย่างเป็นทางการ ฉันจะไม่อธิบายอะไรมากมาย ฉันจะอธิบายฟังก์ชั่นการบูตสปริงทั้งหมดผ่านตัวอย่าง ก่อนอื่นให้ดูที่ Spring Boot เพื่อใช้งาน Web World เวอร์ชัน!
3. โปรแกรมสวัสดีโลก
3.1 Hello World Source Source
ขั้นตอนที่ 1: นำเข้าแพ็คเกจ JAR
<carent> <screatId> org.springframework.boot </groupId> <ratifactId> Spring-Boot-Starter-Parent </artifactid> <version> 1.5.8.release </เวอร์ชัน> </parent> <ArtIfactId> Spring-Boot-Starter-Web </artifactid> </derdency> </pendencies>
ขั้นตอนที่ 2: เขียนคลาสคอนโทรลเลอร์
แพ็คเกจ com.pandy.blog; นำเข้า org.springframework.steretype.controller; นำเข้า org.springframework.web.bind.annotation.requestmapping; นำเข้า org.springframework.web.bind.annotation.responsebody นำเข้า java.util.map; @controllerpublic คลาส helloWorld {@requestmapping ("/hello") @ResponseBody แผนที่สาธารณะ <String, Object> Hello () {Map <String, Object> MAP = New HashMap <> (); map.put ("สวัสดี", "World"); แผนที่กลับ; -ขั้นตอนที่ 3: เขียนคลาสเริ่มต้น (ป้อนไลบรารี)
แพ็คเกจ com.pandy.blog; นำเข้า org.springframework.boot.springapplication; นำเข้า org.springframework.boot.autoconfigure.springbootapplication; @springbootapplicationpublic ระดับแอปพลิเคชัน -
เรียกใช้วิธีหลักของคลาสนี้จากนั้นเยี่ยมชม http: // localhost: 8080/สวัสดีและคุณสามารถดูผลลัพธ์ต่อไปนี้:
คุณรู้สึกมีความสุขมากไหม? หากคุณไม่มีการกำหนดค่าบรรทัดเดียวคุณสามารถเรียกใช้เว็บแอปพลิเคชันได้โดยตรง แต่คุณเคยคิดบ้างไหมว่าสิ่งนี้ประสบความสำเร็จได้อย่างไรหลังจากมีความสุข? ต่อไปเราแยกวิเคราะห์รหัสด้านบนทีละบรรทัด แม้ว่าจะมีไม่กี่บรรทัด แต่ก็ยังมีหลายสิ่งที่ควรค่าแก่การเรียนรู้และความเข้าใจ
3.2 การวิเคราะห์ไฟล์ POM
เริ่มต้นด้วยไฟล์ POM ซึ่งแนะนำการพึ่งพาสองรายการในไฟล์ POM เท่านั้น อันแรกคือผู้ปกครองสปริง-สตาร์สตาร์เทอร์ เพื่อนที่คุ้นเคยกับ Maven ควรรู้ว่า Maven ยังสามารถสืบทอดการกำหนดค่าจากไฟล์ PAM POM เช่นคลาส เราสามารถดูไฟล์ POM ของผู้ปกครองสปริง-สตาร์เทอร์ เนื่องจากปัญหาด้านอวกาศเราดูเพียงสองส่วนที่นี่ สิ่งอื่น ๆ ง่ายต่อการเข้าใจ คุณสามารถอ่านได้ด้วยตัวเอง ส่วนแรกคือ:
ไฟล์นี้สืบทอดไฟล์ POM อื่นคือ Spring-Boot-dependencies ไฟล์นี้มีขวดจำนวนมากและฟังก์ชั่นของมันคือการจัดการเวอร์ชันของแพ็คเกจ JAR อย่างสม่ำเสมอที่สปริงบูตขึ้นอยู่กับ ดังนั้นคุณจะเห็นได้ในภายหลังว่าเมื่อแนะนำขวดในแต่ละองค์ประกอบไม่จำเป็นต้องระบุหมายเลขเวอร์ชัน อีกจุดหนึ่งที่ต้องอธิบายคือการจัดการไฟล์การกำหนดค่า:
อย่างที่คุณเห็นโดยค่าเริ่มต้นไฟล์ในไดเรกทอรี/SRC/Main/Resources จะถูกเพิ่มลงในไฟล์ classPath เป็นไฟล์ทรัพยากร นอกจากนี้สถานที่นี้จะกรองไฟล์สามไฟล์เท่านั้น: แอปพลิเคชัน*.yml, แอปพลิเคชัน*.yaml และแอปพลิเคชัน*.properties ตัวกรองนี้หมายถึงอะไร? ทุกคนที่กำหนดค่าสปริง MVC ควรรู้ว่าเมื่อกำหนดค่าฐานข้อมูลเรามักจะกำหนดค่าข้อมูลฐานข้อมูลในไฟล์คุณสมบัติแล้วแนะนำในไฟล์การกำหนดค่าฤดูใบไม้ผลิผ่านรูปแบบของ <property name = "driverclass" value = "$ {jdbc.driver}" /> ฟังก์ชั่นของตัวกรองนี้คือการแทนที่คู่ค่าชื่อที่กำหนดค่าในไฟล์กำหนดค่าด้วยอักขระ $ {xxx} ในไฟล์การกำหนดค่าสปริงระหว่างการรวบรวม แต่ฟังก์ชั่นนี้ไม่จำเป็น แม้ว่าจะไม่ได้ถูกแทนที่สปริงก็สามารถอ่านรายการการกำหนดค่าได้ที่รันไทม์
เพื่อสรุป: บทบาทของพ่อแม่-สปริง-สตาร์เทอร์:
1) การจัดการแพ็คเกจ JAR
2) การจัดการไฟล์การกำหนดค่าเริ่มต้น
3) การจัดการปลั๊กอินทั่วไป
ในความเป็นจริงจากการวิเคราะห์สิ่งที่เราจะเห็นได้ว่าฟังก์ชั่นหลักของผู้ปกครองสปริง-สตาร์สตาร์เทอร์คือการจัดการแพ็คเกจขวดทั้งหมดที่สปริงบูตขึ้นอยู่กับ อย่างไรก็ตามมีปัญหาที่ชัดเจนกับวิธีการหลัก หลาย บริษัท มีไฟล์หลักของตัวเองและ Maven ไม่สามารถกำหนดค่าผู้ปกครองหลายคนได้ ฉันควรทำอย่างไรถ้าไม่ได้ใช้ผู้ปกครองสปริง-สตาร์เทอร์ คุณต้องนำเข้าแพ็คเกจ JAR ทีละตัวหรือไม่? ในความเป็นจริง Spring Boot เป็นอีกวิธีหนึ่งในการแก้ปัญหานี้ซึ่งคือการเพิ่มการจัดการการพึ่งพาของ Spring Boot ในไฟล์ POM ของตัวเอง:
<การพึ่งพาการจัดการ> <การพึ่งพา> <การพึ่งพา> <roupId> org.springframework.boot </groupId> <ratifactid> สปริง-พึ่งพาอาศัยกันดี </artifactid> <cope> การพึ่งพาอาศัยกัน> </การพึ่งพา> </การพึ่งพา> </การพึ่งพา> </การพึ่งพา> </การพึ่งพา> </การพึ่งพาอาศัย> </การพึ่งพา> </การพึ่งพาอาศัย> </การพึ่งพาอาศัย> </การพึ่งพา> </การพึ่งพา> </การพึ่งพาการพึ่งพา> <การพึ่งพา> <การพึ่งพาการพึ่งพา> </การพึ่งพา> </การพึ่งพา> </การพึ่งพา> </การพึ่งพา> </การพึ่งพา> </การพึ่งพาอาศัย> </การพึ่งพา> </การพึ่งพาอาศัย> </การพึ่งพาอาศัย> </การพึ่งพา> </การพึ่งพา> </การพึ่งพาการพึ่งพา> <การพึ่งพา> <การพึ่งพาการพึ่งพา> </predency> </dermentency> </predency> </predency> </การพึ่งพาอาศัย> </การพึ่งพาอาศัย> </dependency> </
ในความเป็นจริงจากการวิเคราะห์ข้างต้นเราจะเห็นได้ว่านี่เป็นผู้ปกครองของไฟล์ POM ผู้ปกครองสปริง-สตาร์สตาร์เทอร์และไฟล์ POM นี้ส่วนใหญ่จะจัดการแพ็คเกจ JAR จำนวนมาก ดังนั้นหลังจากนำเข้าสิ่งนี้คุณไม่จำเป็นต้องใส่ทีละคนเพื่อนำเข้า อย่างไรก็ตามในกรณีนี้จะไม่ใช้ปลั๊กอินใน Spring-Boot-Starter-Parent และจะไม่ใช้งานและฟังก์ชั่นการเปลี่ยนไฟล์การกำหนดค่าเริ่มต้นไม่พร้อมใช้งานอีกต่อไป อย่างไรก็ตามสิ่งนี้ไม่มีผล ในอีกด้านหนึ่งฟังก์ชั่นเหล่านี้ไม่จำเป็นและในทางกลับกันหากจำเป็นถ้าจำเป็นก็ง่ายที่จะเพิ่มด้วยตัวเอง
3.3 การวิเคราะห์คลาส HelloWorld:
มาดูคลาส HelloWorld กันเถอะ หลังจากใช้ Spring MVC คุณควรรู้ว่าคลาสนี้ไม่เกี่ยวข้องกับ Spring Boot และรหัสธุรกิจไม่มีอะไรเกี่ยวข้องกับฤดูใบไม้ผลิ นี่เป็นหลักการที่ฤดูใบไม้ผลิได้ปฏิบัติตามเสมอและมันก็แพร่กระจายอย่างมากซึ่งเป็นเหตุผลหลักสำหรับความสำเร็จของฤดูใบไม้ผลิ มีสามคำอธิบายประกอบที่เกี่ยวข้องกับฤดูใบไม้ผลิในชั้นเรียนนี้ ได้แก่ @Controller, @requestmapping และ @ResponseBody แต่คำอธิบายประกอบทั้งสามนี้ยังจัดทำโดย Spring MVC ไม่มีการเชื่อมต่อกับสปริงบูตมากนักดังนั้นฉันจะไม่เข้าไปดูรายละเอียดที่นี่ หากคุณยังไม่ชัดเจนคุณสามารถตรวจสอบเนื้อหาของ Spring MVC ฟังก์ชั่นพื้นฐานของคำอธิบายประกอบทั้งสามมีดังนี้:
3.4 การวิเคราะห์คลาสแอปพลิเคชัน
สุดท้ายมาดูคลาสแอปพลิเคชันแล้วคุณจะพบว่ามีสิ่งต่าง ๆ น้อยลงในชั้นเรียนนี้ มีรหัสที่มีประโยชน์เพียงบรรทัดเดียวเท่านั้นคือ SpringApplication.run (application.class, args); ฟังก์ชั่นของวิธีนี้คือการโหลดคลาสแอปพลิเคชัน มีอะไรพิเศษเกี่ยวกับคลาสแอปพลิเคชันหรือไม่? คุณสามารถดู ในความเป็นจริงสิ่งเดียวที่พิเศษเกี่ยวกับคลาสนี้คือคำอธิบายประกอบ @springbootapplication ดังนั้นการทำงานของสปริงบูตจะต้องมีการเชื่อมต่อมากมายกับคำอธิบายประกอบนี้ เราสามารถดูซอร์สโค้ดของคำอธิบายประกอบนี้:
@Target (ElementType.type) @retention (RetentionPolicy.runtime)@documented@สืบทอด@springbootconfiguration@enableautoconfiguration@componentscan (excludefilters = {@filter คลาส = autoconfigurationExcludefilter.class)}) สาธารณะ @interface Springbootapplication {ฉันจะไม่พูดถึงวิธีการหลักของคำอธิบายประกอบนี้ คุณสามารถดูได้หลังจากอ่าน ส่วนใหญ่จะให้นามแฝงสำหรับคำอธิบายประกอบข้างต้น ทุกคนควรรู้ว่าคำอธิบายประกอบสี่รายการแรก (@Target (ElementType.type), @retention (RESINGINTPOLICY.RUNTIME), @Documented, @Inherited) ถูกกล่าวถึงข้างต้น เพื่อนที่ไม่คุ้นเคยจะมาดูว่า JDK ใช้คำอธิบายประกอบที่กำหนดเองอย่างไร มาอธิบายรายละเอียดสามคำอธิบายประกอบสามรายการถัดไป: @springbootconfiguration, @enableautoconfiguration, @componentscan
มาดู SpringBootConfiguration ก่อน คำอธิบายประกอบนี้ค่อนข้างง่ายและซอร์สโค้ดมีดังนี้:
@Target ({ElementType.type})@retention (RetentionPolicy.runtime)@documented@configurationPublic @Interface SpringBootConfiguration {}คำอธิบายประกอบนี้สืบทอดเฉพาะ @configuration ทุกคนควรรู้ว่า Spring มีวิธีการกำหนดค่าสามวิธี: (1) การกำหนดค่าไฟล์ XML (2) การกำหนดค่าคำอธิบายประกอบ (3) การกำหนดค่าคลาส Java @Configuration เป็นคำอธิบายประกอบที่ใช้ในการระบุคลาสเป็นคลาสการกำหนดค่า หลังจากฤดูใบไม้ผลิ 4 การกำหนดค่าเป็นที่นิยมมากขึ้นในคลาส Java ดังนั้น Spring Boot จึงมีแนวโน้มที่จะอยู่ในลักษณะนี้ และจากซอร์สโค้ดจะเห็นได้ว่าฟังก์ชั่นของ SpringBootConfiguration คือการระบุคลาสเป็นคลาสการกำหนดค่า
ถัดไปมาดูคำอธิบายประกอบ @enableautoconfiguration ซอร์สโค้ดของคำอธิบายประกอบนี้ค่อนข้างซับซ้อน ฉันจะไม่เข้าไปดูรายละเอียดที่นี่ ฉันจะนำไปใช้ในบทความในภายหลังโดยละเอียด ให้ฉันพูดถึงฟังก์ชั่นของคำอธิบายประกอบนี้ ฟังก์ชั่นหลักคือการใช้การกำหนดค่าอัตโนมัติ การกำหนดค่าอัตโนมัติคืออะไร? Spring Boot จะสร้างการกำหนดค่าอัตโนมัติตามแพ็คเกจ JAR ที่คุณแนะนำ ตัวอย่างเช่นหากมี Jar HSQLDB ใน ClassPath, Spring Boot จะกำหนดค่าฐานข้อมูลในหน่วยความจำโดยอัตโนมัติสำหรับคุณ ในตัวอย่างนี้เรายังสามารถเห็นได้ว่าเนื่องจากเราได้แนะนำ Spring-MVC, Tomcat และขวดอื่น ๆ ที่เกี่ยวข้องการบูตฤดูใบไม้ผลิจะเดาว่าคุณเป็นโครงการเว็บและจากนั้นมันจะทำการกำหนดค่า MVC ในฤดูใบไม้ผลิโดยอัตโนมัติเช่นการสนับสนุนทรัพยากรคงที่ นักเรียนที่คุ้นเคยกับสปริงเปิดใช้งาน* คำอธิบายประกอบควรจะสามารถเข้าใจคำอธิบายประกอบนี้ได้ง่ายขึ้นเพราะมีคำอธิบายประกอบที่คล้ายกันมากมายในฤดูใบไม้ผลิ
สุดท้ายมาดู @componentscan กันเถอะ คำอธิบายประกอบนี้ไม่ได้จัดทำโดย Spring Boot แต่มีให้ในฤดูใบไม้ผลิ แพ็คเกจหรือคลาสที่สแกนโดยฤดูใบไม้ผลินั่นคือแพ็คเกจและชั้นเรียนจะรวมอยู่ในการจัดการของคอนเทนเนอร์ IOC ในฤดูใบไม้ผลิโดยอัตโนมัติ IOC อินสแตนซ์คลาสเหล่านี้ตามการกำหนดค่า
ตอนนี้เรามาสรุปฟังก์ชั่นของคำอธิบายประกอบ SpringbootConfiguration:
1) ทำเครื่องหมายว่าคลาสนี้เป็นคลาสการกำหนดค่า
2) ระบุแพ็คเกจสแกนเพื่ออำนวยความสะดวกในการจัดคอนเทนเนอร์ IOC ในฤดูใบไม้ผลิเพื่อจัดการอินสแตนซ์และวัฏจักรชีวิตของพวกเขา
3) การกำหนดค่าอัตโนมัติและใช้แพ็คเกจ JAR ที่แนะนำเพื่อเดาความตั้งใจของผู้ใช้ในการกำหนดค่าโดยอัตโนมัติ
4. สรุป
บทความนี้วิเคราะห์เวอร์ชันเว็บของ Hello World ที่นำมาใช้โดย Spring Boot โดยละเอียด จากตัวอย่างนี้เราเข้าใจการดำเนินงานพื้นฐานของ Spring Boot และผ่านการวิเคราะห์รหัสในแต่ละบรรทัดเรามีความเข้าใจคร่าวๆเกี่ยวกับหลักการของการบูตฤดูใบไม้ผลิ โดยรวมแล้ว Spring Boot จัดการแพ็คเกจ JAR อย่างสม่ำเสมอจากนั้นกำหนดค่าโดยอัตโนมัติตามตัวเริ่มต้นที่เราเลือก ด้วยวิธีนี้แก้การจัดการการพึ่งพาที่ซับซ้อนและปรับปรุงการกำหนดค่าเพื่อให้นักพัฒนาสามารถมุ่งเน้นไปที่ธุรกิจของพวกเขามากขึ้นโดยไม่ต้องทำงานที่ซับซ้อนมาก ในเวลาเดียวกันบริการที่รวดเร็วและน้ำหนักเบาของ Spring Boot ก็เหมาะสำหรับสถาปัตยกรรม Microservice ฉันจะแบ่งปันสิ่งนี้กับคุณหากคุณมีโอกาสติดตาม ยินดีต้อนรับสู่การติดตามต่อไป