ทำไม
ในตอนต้นของการเกิดจุดประสงค์หลักของการสร้างฤดูใบไม้ผลิคือการแทนที่เทคโนโลยี Java ระดับองค์กรที่มีน้ำหนักมากขึ้นโดยเฉพาะอย่างยิ่ง EJB เมื่อเปรียบเทียบกับ EJB สปริงให้รูปแบบการเขียนโปรแกรมที่เบาและง่ายขึ้น
อะไร
ฤดูใบไม้ผลิเป็นเฟรมเวิร์กโอเพ่นซอร์สที่สร้างขึ้นครั้งแรกโดย Rodjohnson ฤดูใบไม้ผลิถูกสร้างขึ้นเพื่อแก้ปัญหาความซับซ้อนของการพัฒนาแอปพลิเคชันระดับองค์กร การใช้ฤดูใบไม้ผลิสามารถเปิดใช้งาน Javabeans อย่างง่ายเพื่อใช้สิ่งที่ EJB เท่านั้นที่สามารถทำได้ก่อนหน้านี้ สปริงไม่ได้ จำกัด อยู่ที่การพัฒนาฝั่งเซิร์ฟเวอร์แอปพลิเคชัน Java ใด ๆ จะได้รับประโยชน์จากฤดูใบไม้ผลิในแง่ของความเรียบง่ายความสามารถในการทดสอบและการมีเพศสัมพันธ์แบบหลวม
วันนี้ฤดูใบไม้ผลิมีส่วนร่วมในการพัฒนามือถือการรวม API โซเชียลฐานข้อมูล NOSQL การประมวลผลแบบคลาวด์และข้อมูลขนาดใหญ่ เมื่อเวลาผ่านไป EJB ยังใช้แนวคิดของการฉีดพึ่งพาการพึ่งพา (DI) และการเขียนโปรแกรมที่มุ่งเน้นด้าน (AOP) ในระยะสั้นภารกิจพื้นฐานที่สุดของฤดูใบไม้ผลิคือการพัฒนา Java ให้ง่ายขึ้น
ยังไง
เพื่อลดความซับซ้อนของการพัฒนา Java ฤดูใบไม้ผลิใช้กลยุทธ์สำคัญ 4 นาที
การเขียนโปรแกรมที่มีน้ำหนักเบาและมีการรุกรานน้อยที่สุดโดยใช้ POJO ช่วยให้การมีเพศสัมพันธ์แบบหลวมผ่านการฉีดพึ่งพาและอินเทอร์เฟซ
การเขียนโปรแกรมที่ประกาศขึ้นอยู่กับส่วนและการประชุมลดรหัสสไตล์ผ่านส่วนและเทมเพลต
ศักยภาพของ Pojo
เฟรมเวิร์กจำนวนมากบังคับแอปพลิเคชันเพื่อสืบทอดคลาสของพวกเขาหรือใช้อินเทอร์เฟซซึ่งนำไปสู่แอปพลิเคชันที่ถูกผูกไว้กับเฟรมเวิร์กซึ่งเป็นการเขียนโปรแกรมที่รุกรานส่งผลให้ไม่สามารถนำบล็อกรหัสกลับมาใช้ใหม่ได้ สปริงมุ่งมั่นที่จะหลีกเลี่ยงการทำให้รหัสแอปพลิเคชันของคุณยุ่งเหยิงเนื่องจาก API ของตัวเอง ในแอปพลิเคชันที่สร้างขึ้นในฤดูใบไม้ผลิชั้นเรียนมักจะไม่มีร่องรอยของสัญญาณใด ๆ ที่คุณใช้สปริง
ชั้นเรียนสาธารณะ HelloWorldBean {Public String Sayshello () {return "Hello World"; - รหัสตัวอย่างข้างต้นแสดงถึงคลาส Java ที่ง่ายและธรรมดา (POJO) คุณไม่สามารถบอกได้ว่ามันเป็นองค์ประกอบของฤดูใบไม้ผลิ การเขียนโปรแกรมที่ไม่รุกรานของฤดูใบไม้ผลิสะท้อนให้เห็นในชั้นเรียนนี้ซึ่งสามารถมีบทบาทในแอพพลิเคชั่นฤดูใบไม้ผลิและแอปพลิเคชันที่ไม่ใช่สปริง เพียงแค่รหัสชิ้นนี้ไม่ได้สะท้อนฟังก์ชั่นของฤดูใบไม้ผลิและความรู้ต่อไปนี้ยังคงเป็นสิ่งจำเป็น
การฉีดพึ่งพา (การฉีดคลาสเองขึ้นอยู่กับ)
การฉีดพึ่งพาไม่สูงในฤดูใบไม้ผลิแม้ว่ามันจะพัฒนาเป็นเทคนิคการเขียนโปรแกรมที่ซับซ้อนหรือแนวคิดการออกแบบรูปแบบ สิ่งนี้เป็นที่เข้าใจกันในฤดูใบไม้ผลิการพึ่งพาการฉีด แอปพลิเคชันที่มีนัยสำคัญในทางปฏิบัติต้องใช้หลายชั้นเรียนเพื่อร่วมมือกันเพื่อให้ตรรกะทางธุรกิจที่เฉพาะเจาะจง การปฏิบัติแบบดั้งเดิมคือแต่ละวัตถุมีหน้าที่รับผิดชอบในการจัดการการอ้างอิงถึงวัตถุที่เกี่ยวข้องกับตัวเอง (วัตถุที่เกี่ยวข้องนี้เป็นวัตถุที่ขึ้นอยู่กับวัตถุที่แสดงในฤดูใบไม้ผลิ) แต่สิ่งนี้จะทำให้ยากต่อการทดสอบคู่และรหัส
พิจารณารหัสต่อไปนี้
/** ชื่อชั้นเรียนที่ยากต่อการพูดคุยนี้ได้รับการตั้งชื่อเป็นพิเศษโดยผู้เขียนเพื่อให้พอดีกับฉากจำลอง* คลาสนี้แสดงถึงอัศวินที่ช่วยชีวิตหญิงสาว* ที่สร้างโดย Wung ในปี 2016/8/25 */ชั้นเรียนสาธารณะ DamselrescuingKnight ใช้อัศวิน {Private Rescuedamselquest Quest;/*** สร้าง Rescuedamselquest ในตัวสร้าง* สิ่งนี้ทำให้ DamselrescuingKnight และ RescuingDamselquest ในคอนสตรัคเตอร์ร่วมกัน EmmarkonQuest () {Quest.embark ();}} การมีเพศสัมพันธ์มีสองด้าน ในอีกด้านหนึ่งรหัสคู่ที่แน่นหนานั้นยากที่จะทดสอบนำกลับมาใช้ใหม่และเข้าใจและจะมีข้อบกพร่องประเภท "ต่อสู้ของ Goblin" ในทางกลับกันการมีเพศสัมพันธ์ในระดับหนึ่งเป็นสิ่งจำเป็นและชั้นเรียนที่แตกต่างกันจะต้องมีปฏิสัมพันธ์ในวิธีที่เหมาะสม
ปัญหาเกิดขึ้นสปริงแก้ปัญหาได้อย่างไร?
ในฤดูใบไม้ผลิผ่านการฉีดพึ่งพา (DI) การพึ่งพาระหว่างวัตถุถูกตั้งค่าโดยส่วนประกอบของบุคคลที่สามในระบบที่ประสานงานแต่ละวัตถุเมื่อสร้างวัตถุ กล่าวอีกนัยหนึ่งวัตถุจำเป็นต้องจัดการคุณสมบัติภายในของพวกเขาโดยไม่ต้องสร้างหรือจัดการการพึ่งพาด้วยตนเองและการพึ่งพาจะถูกฉีดเข้าไปในวัตถุที่ต้องการโดยอัตโนมัติ
/*** อัศวินคนนี้สามารถทำงานผจญภัยต่าง ๆ ได้แทนที่จะเป็นเพียงงานก่อนหน้านี้เพื่อช่วยเหลือเด็กผู้หญิง* ที่สร้างโดย Wung ในปี 2016/8/25 */คลาสสาธารณะ Braveknight ใช้อัศวิน {Quest Private Quest;/*** Braveknight ไม่ได้สร้างประเภทการผจญภัยด้วยตัวเอง แต่ผ่านงานการผจญภัยเป็นพารามิเตอร์ในระหว่างการก่อสร้าง* นี่เป็นวิธีการฉีดพึ่งพาอาศัยกัน Braveknight ไม่ได้เป็นคู่กับการใช้งานภารกิจเฉพาะใด ๆ ตราบใดที่งานใช้อินเทอร์เฟซเควสมันไม่สำคัญว่าการผจญภัยประเภทใด สิ่งนี้บรรลุวัตถุประสงค์ของการมีเพศสัมพันธ์ที่หลวม
หากวัตถุระบุการพึ่งพาผ่านอินเตอร์เฟสเท่านั้นการพึ่งพานี้สามารถแทนที่ด้วยการใช้งานคอนกรีตที่แตกต่างกันโดยไม่มีวัตถุที่ตระหนักถึง
ตอนนี้มาฉีดความหมายเชิงปฏิบัติกันเถอะ
สำหรับรหัสข้างต้นเราจะฉีดงานผจญภัยด้วยการใช้งานเฉพาะในอัศวินผู้กล้าหาญ
/** ภารกิจการผจญภัยของการสังหารมังกร (ผู้เขียนคนนี้เป็นชั้นสองที่ดี)*สร้างโดย Wung เมื่อวันที่ 2016/8/25 */คลาสสาธารณะ SlaydragonQuest ใช้ Quest {Private Printstream Stream; Public SlaydragonQuest (PrintStream Stream) {this.stream = stream;} โมฆะสาธารณะ immark () {stream.print ("Slay the Dragon");}}}}}}}ดังนั้นตอนนี้คำถามคือวิธีการฉีดวัตถุ printstream ขึ้นอยู่กับใน Slaydragonquest วิธีการฉีดวัตถุเควสที่ขึ้นอยู่กับใน Braveknight ฤดูใบไม้ผลิดังกล่าวจะจัดการกับการพึ่งพาเหล่านี้จากส่วนกลางและพฤติกรรมของการสร้างความร่วมมือระหว่างส่วนประกอบแอปพลิเคชันมักเรียกว่าแอสเซมบลี (การเดินสาย) นั่นคือการฉีด ฤดูใบไม้ผลิมีวิธีการประกอบที่หลากหลายเพื่อแนะนำรายละเอียดเพิ่มเติมในภายหลัง ที่นี่เราแนะนำการชุมนุมตาม XML และการประกอบตามสั้น ๆ ตามคำอธิบายประกอบ Java
<!- นี่คือกระบวนการประกอบ ประกาศ Slaydragonquest เป็นถั่วชื่อ "Quest" เนื่องจากเป็นการฉีดคอนสตรัคเตอร์ใช้ค่าแอตทริบิวต์คอนสตรัคเตอร์อาร์กเพื่อแสดงค่าที่ฉีด กระบวนการนี้แก้ปัญหาก่อนหน้านี้ ฉีดวัตถุ printstream ลงในวัตถุ SlaydragonQuest-> <bean id = "Quest"> <constructor-Arg value = "#{t (ระบบ) .out}"> </constructor-Arg> </ebean> <!-กระบวนการนี้เหมือนกับข้างต้น Braveknight ประกาศถั่วที่ชื่อว่า "Knight" (ไม่จำเป็นต้องใช้ชื่อนี้) จากนั้นพารามิเตอร์ตัวสร้างของ Braveknight จะต้องเป็นประเภทภารกิจ ในเวลานี้ถั่วอีกตัวจะผ่านการอ้างอิงซึ่งเป็นการอ้างอิงของถั่วที่มีชื่อ "เควส" ด้านบน ในเวลานี้การฉีดคอนสตรัคเตอร์ของ Braveknight ก็เสร็จสมบูรณ์เช่นกัน-> <bean id = "Knight"> <constructor-Arg ref = "Quest"> </constructor-Arg> </ebean>ฤดูใบไม้ผลิให้การกำหนดค่าที่ใช้ Java ซึ่งสามารถใช้เป็นทางเลือกแทน XML
/** ไฟล์การกำหนดค่าที่ใช้ Java ใช้แอสเซมบลีของวัตถุ*สร้างโดย Wung เมื่อปี 2016/8/26 */ @configurationPublic คลาส KnightConfig {@Bean Public Knight () {ส่งคืน BraveKnight ใหม่ (Quest ()); } @Bean Public Quest Quest () {ส่งคืน SlaydragonQuest ใหม่ (System.out); -เอฟเฟกต์เหมือนกันและคำอธิบายเฉพาะอธิบายไว้ในรายละเอียดในบทถัดไป ลองตรวจสอบอีกครั้ง มีการกล่าวกันว่าฤดูใบไม้ผลิจะจัดการการพึ่งพาระหว่างวัตถุโดยอัตโนมัติดังนั้นผู้จัดการประเภทนี้คืออะไร? คำตอบคือบริบทแอปพลิเคชันซึ่งเป็นคอนเทนเนอร์สำหรับสปริงที่สามารถโหลดคำจำกัดความของถั่วและประกอบ บริบทแอปพลิเคชันฤดูใบไม้ผลิมีความรับผิดชอบเพียงอย่างเดียวสำหรับการสร้างและการประกอบวัตถุ ในความเป็นจริงมีหลายวิธีในการใช้ความแตกต่างระหว่างบริบทนี้เพียงความแตกต่างในการกำหนดค่าการโหลด มาดูวิธีโหลดการกำหนดค่า
คลาสสาธารณะ Knightmain {โมฆะสาธารณะคงที่หลัก (สตริง [] args) {AnnotationConfigapplicationContext Context = New AnnotationConfigapplicationContext (KnightConfig.Class); // คำจำกัดความของถั่วสามารถรับได้จากไฟล์การกำหนดค่า Knight Knight = context.getBean (Knight.class); Knight.EmbarkonQuest (); Context.close (); -ใช้การตัดใบหน้า
DI สามารถเก็บส่วนประกอบซอฟต์แวร์ที่ทำงานร่วมกันได้อย่างหลวม ๆ ในขณะที่การเขียนโปรแกรม FACet ช่วยให้คุณสามารถแยกฟังก์ชั่นทั่วทั้งแอปพลิเคชันเพื่อสร้างส่วนประกอบที่นำกลับมาใช้ใหม่ได้และโดยเฉพาะอย่างยิ่งมันเป็นเทคโนโลยีที่ผลักดันระบบซอฟต์แวร์ให้มุ่งเน้น โฟกัสคืออะไร? บริการระบบเช่นการบันทึกการจัดการธุรกรรมและการจัดการความปลอดภัยมักจะต้องรวมเข้ากับส่วนประกอบอื่น ๆ ที่มีตรรกะทางธุรกิจด้วยตนเอง บริการระบบเหล่านี้มักจะเรียกว่าโฟกัสข้ามการตัดเพราะพวกเขาจะถูกนำมาใช้ซ้ำในหลายสถานที่ซึ่งครอบคลุมหลายองค์ประกอบของระบบ พูดง่ายๆคือคุณดึงบริการที่ต้องนำกลับมาใช้ใหม่จากส่วนประกอบอื่น ๆ แต่จะใช้อย่างไร ในความเป็นจริงมันคือการแทรกวิธีการเข้าไปในสถานที่ที่คุณต้องใช้เมื่อใช้ อย่างไรก็ตามตามคำว่า "ส่วน" ควรแสดงว่าเป็นการแยกส่วนประกอบที่นำกลับมาใช้ใหม่เป็นส่วนหนึ่งและตัดส่วนผ่านส่วนประกอบเมื่อจำเป็น ดังนั้นด้วยวิธีนี้แอปพลิเคชันหลักไม่จำเป็นต้องทราบการมีอยู่ของส่วนเหล่านี้และส่วนจะไม่รวมตรรกะทางธุรกิจเข้ากับแอปพลิเคชันหลัก
/** คลาสนักร้องที่ใช้ในการสรรเสริญอัศวินนั่นคือเพื่อรับใช้อัศวิน*ที่สร้างโดย Wung ในปี 2016/8/26 */คลาสสาธารณะ minstrel {สตรีม Private Printstream; minstrel สาธารณะ (สตรีม printstream) {this.stream = สตรีม; } // ดำเนินการโมฆะสาธารณะ SingBeforeQuest () {stream.print ("เริ่มต้น"); } // ดำเนินการโมฆะสาธารณะ singafterquest () {stream.print ("end"); - คลาสสาธารณะ Braveknight ใช้อัศวิน {Quest Private Quest; Minstrel ส่วนตัว Minstrel;/*** Braveknight ไม่ได้สร้างประเภทการผจญภัยด้วยตัวเอง แต่ผ่านงานการผจญภัยเป็นพารามิเตอร์ในการก่อสร้าง* นี่เป็นวิธีการฉีดพึ่งพาอาศัยกัน minstrel) {this.quest = Quest; this.minstrel = minstrel;} โมฆะสาธารณะ immarkonQuest () {minstrel.singbeforequest (); Quest.embark (); minstrel.singafterquest ();}}}} ในเวลานี้อัศวินผู้กล้าหาญเริ่มดำเนินการ แต่เขาพบว่าในหน้าที่ของเขามันไม่ใช่แค่ความเสี่ยง แต่ตอนนี้เขาต้องจัดการนักร้องเพื่อสรรเสริญเขา แต่สิ่งนี้ไม่ควรเป็นของหมวดหมู่ที่ควรได้รับการจัดการ ดังนั้นการใช้แนวคิดของส่วนเราจำเป็นต้องแยกพฤติกรรมการสรรเสริญของนักร้องและกลายเป็นส่วนหนึ่ง ก่อนที่นักรบจะได้รับความเสี่ยงส่วนนี้จะถูกตัดข้ามและดำเนินการวิธีการร้องเพลง SingBeforequest และดำเนินการวิธีการ singafterquest หลังจากความเสี่ยง ดังนั้นสิ่งนี้จะตระหนักถึงรหัสที่ไม่จำเป็นต้องได้รับการยกย่องจากอัศวินและนักร้องไม่ได้มีอยู่ในวัตถุของอัศวิน เขาจะไม่เพียง แต่สรรเสริญอัศวินเท่านั้น แต่ยังสรรเสริญทุกคนตราบใดที่คนอื่นใช้ส่วนนี้เพื่อเข้า
<!-หมายความว่าการกำหนดค่าถั่วด้วย ID ด้านบนเป็น minstrel เป็นส่วนหนึ่งกำลังกำหนดค่านักร้องเป็นส่วน-> ref = "minstrel"> <!-การกำหนดจุดเข้านั่นคือที่จะใช้ส่วนนิพจน์ = "การดำเนินการ ( * * .EMBARKONQUEST การดำเนินการโพสต์โน้ตก่อนและหลังจุดเข้า-การตัด-> </aop: หลังจาก> </aop: ก่อน> </aop: pointcut> </aop: </aop: config>
สถานการณ์คือ Minstrel ยังคงเป็น Pojo อิสระและบริบทของฤดูใบไม้ผลิได้เปลี่ยนเป็นส่วนหนึ่ง สิ่งที่สำคัญที่สุดคืออัศวินไม่มีความคิดเกี่ยวกับการดำรงอยู่ของส่วนนี้ในเวลานี้ นี่เป็นเพียงเกาลัดขนาดเล็กซึ่งสามารถทำสิ่งสำคัญได้มากมาย
ใช้เทมเพลตเพื่อกำจัดรหัสสไตล์
มีสถานการณ์ที่เมื่อเราใช้ JDBC เพื่อเข้าถึงฐานข้อมูลเพื่อสอบถามข้อมูลกระบวนการที่สมบูรณ์จะต้องมีการสร้างการเชื่อมต่อการสร้างวัตถุคำสั่งชุดผลลัพธ์การประมวลผลการสอบถามและการปิดการเชื่อมต่อต่างๆ นอกจากนี้ยังมีข้อยกเว้นต่าง ๆ ที่ถูกจับและจากนั้นสอบถามในสถานการณ์ต่าง ๆ จำเป็นต้องมีการทำซ้ำอย่างเจ็บปวด JDBC ไม่ได้เป็นเพียงกรณีเดียวที่มีรหัสสไตล์มากมายเช่นนี้ ฤดูใบไม้ผลิมีจุดมุ่งหมายเพื่อกำจัดรหัสสไตล์ผ่านการห่อหุ้มแม่แบบเช่น JDBCTEMPLATE ของ Spring
รองรับถั่วของคุณ
ในแอพพลิเคชั่นที่ใช้ในฤดูใบไม้ผลิวัตถุแอปพลิเคชันของคุณอาศัยอยู่ในคอนเทนเนอร์ฤดูใบไม้ผลิซึ่งรับผิดชอบในการสร้างวัตถุที่ประกอบวัตถุและจัดการวงจรชีวิตของพวกเขา สปริงคอนเทนเนอร์คืออะไร? ไม่เพียง แต่คอนเทนเนอร์ประเภทหนึ่งเท่านั้น ฤดูใบไม้ผลิมาพร้อมกับการใช้งานคอนเทนเนอร์หลายรายการ มันแบ่งออกเป็นสองประเภท: โรงงานถั่วซึ่งเป็นภาชนะที่ง่ายที่สุดในการให้การสนับสนุน DI ขั้นพื้นฐาน บริบทของแอปพลิเคชันค่อนข้างสูงและให้บริการระดับแอปพลิเคชันเฟรมเวิร์ก ส่วนใหญ่แล้วบริบทแอปพลิเคชันเป็นที่นิยมมากขึ้น
บริบทของแอปพลิเคชันนั้นแบ่งออกเป็นวิธีการโหลดการกำหนดค่าที่แตกต่างกันมากมาย
คุณสมบัติฤดูใบไม้ผลิต่างๆ
สรุป
ฤดูใบไม้ผลิเป็นเทคโนโลยีเฟรมเวิร์กที่สามารถทำให้การพัฒนาง่ายขึ้นและเนื้อหาหลักคือ DI และ AOP
ข้างต้นคือการนินทาเกี่ยวกับบทความนี้ - ค่อยๆเข้าใจเนื้อหาทั้งหมดของฤดูใบไม้ผลิฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงเว็บไซต์นี้ต่อไปได้:
SpringMVC เริ่มต้นตัวอย่าง
คำอธิบายโดยละเอียดของรหัสสำหรับการฉีดค่าแอตทริบิวต์โดยใช้ไฟล์การกำหนดค่าและ @Value ในฤดูใบไม้ผลิ
ตัวอย่างรหัสรายละเอียดของสปริงในสปริง
หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น