วันนี้ฉันได้พูดคุยกับเพื่อนร่วมงานของฉันว่าจะใช้การรวมกันของ @Configuration และ @Bean เพื่อสร้างถั่วหรือใช้ @Service โดยตรงและคำอธิบายประกอบอื่น ๆ เพื่อวางไว้ในชั้นเรียน ผู้เขียนมีแนวโน้มที่จะใช้ประเภทแรกคือการรวมกันของ @configuration และ @bean
ก่อนอื่นให้ดูตัวอย่างเป้าหมายคือการสร้างถั่วของ SearchService
ใช้ @Service โดยตรง:
// searchService.javapackage li.koly.search; นำเข้า java.util.list; อินเตอร์เฟสสาธารณะ searchService {รายการ <ject> search (String q);} // elasticsearchServiceimpl.javapackage li.koly.Search; java.util.list; @ServiceComponentPublic คลาส ElasticSearchServiceImpl ใช้ SearchService {@Override รายการสาธารณะ <Public> ค้นหา (สตริง q) {return array.aslist ("hello", q); }} // application.javapackage li.koly.search; นำเข้า org.springframework.beans.factory.annotation.autowired; นำเข้า org.springframework.boot.springapplication; org.springframework.web.bind.annotation.getMapping; นำเข้า org.springframework.web.bind.annotation.restcontroller; นำเข้า java.util.list;@springbootapplication@restcontrollerpublic @GetMapping ("/search") รายการสาธารณะ <Ojrop> สวัสดี (สตริง q) {return searchService.search (q); } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {springapplication.run (application.class, args); -เริ่มแอปพลิเคชัน, การเข้าถึงเบราว์เซอร์: http: // localhost: 8081/ค้นหา? q = koly, หน้าจอแสดงผล: ["สวัสดี", "koly"]
วิธีใช้ @configuration และ @bean:
// ElasticSearchServiceImpl.javapackage li.koly.search; นำเข้า java.util.arrays; นำเข้า java.util.list; ชั้นเรียนสาธารณะ ElasticsearchServiceImpl นำการค้นหา {@Override รายการสาธารณะ <Ojrop> การค้นหา (String Q) }} // appconfig.javapackage li.koly.search; นำเข้า org.springframework.context.annotation.bean; นำเข้า org.springframework.context.annotation.configuration; @configurationpublic -เมื่อเปรียบเทียบกับรหัสที่ใช้ @Service โดยตรงมีคลาส AppConfig และคำอธิบายประกอบ @Service ที่วางไว้บน ElasticSearchServiceImpl จะถูกลบออก เมื่อมองแวบแรกมีรหัสและชั้นเรียนมากขึ้น แล้วการใช้หลังมีประโยชน์อย่างไร?
ผู้เขียนเชื่อว่าผลประโยชน์คือ:
การแยกข้อกังวล
การใช้ @configuration และ @bean การสร้างถั่วจะถูกวางไว้ในที่เดียวและอินเทอร์เฟซและการใช้งานไม่มีส่วนเกี่ยวข้องกับการสร้างถั่ว
หากจำเป็นต้องมีการเปลี่ยนแปลงการสร้างถั่วคุณจะต้องดูและแก้ไขคลาสการกำหนดค่าที่สอดคล้องกันและคุณไม่จำเป็นต้องไปที่ถั่วชวาที่เกี่ยวข้องสำหรับการเปลี่ยนแปลง ตัวอย่างเช่นบางครั้งการสร้างถั่วต้องใช้ความร่วมมือกับ @Scope หรือ @Profile และคุณจะต้องแก้ไขคลาสการกำหนดค่าในเวลานี้
ความรับผิดชอบเดี่ยว
คำอธิบายประกอบ @Service นั้นมีหน้าที่รับผิดชอบสองประการ:
หนึ่งคือการสร้างถั่ว;
ประการที่สองคือการระบุคลาสเป็นบริการ
บ่งชี้ว่าคลาสที่มีคำอธิบายประกอบเป็น "บริการ" ซึ่งเดิมกำหนดโดยโดเมนที่ขับเคลื่อน
การออกแบบ (Evans, 2003) ในฐานะ "การดำเนินการที่นำเสนอเป็นอินเทอร์เฟซที่ยืนอยู่คนเดียวในโมเดลโดยไม่มีสถานะห่อหุ้ม"
ข้างต้นเป็นคำอธิบายของสปริงเกี่ยวกับคำอธิบายประกอบ @Service กล่าวคือ @Service จริง ๆ แล้วแสดงถึงการดำเนินการที่ไร้สัญชาติอิสระและมีให้ใน DDD
การใช้วิธีการของ @Bean และ @Configuration การสร้างถั่วจะถูกส่งไปยังคลาสแยกต่างหากและข้อมูลประจำตัวบริการจะถูกส่งไปยังอินเทอร์เฟซและชื่อคลาสใน Java สิ่งนี้สะท้อนให้เห็นในข้อมูลฤดูใบไม้ผลิ ตัวอย่างเช่นที่เก็บจะถูกระบุด้วยชื่อเช่น crudrepository ดังนั้นบริการก็สะท้อนให้เห็นด้วยชื่อของมัน คำจำกัดความลำดับชั้นเฉพาะผ่านชื่อโดยไม่ต้องพึ่งพาคำอธิบายประกอบที่จัดทำโดยฤดูใบไม้ผลินั้นสะดวกในการจัดลำดับชั้นมากขึ้นตามโครงการเช่นเลเยอร์ Mapper, Layer Validator ฯลฯ
นอกจากนี้ถั่วและบริการมีสองมิติ หนึ่งคือเกี่ยวกับการใช้งานที่เป็นรูปธรรมและอีกอย่างเกี่ยวกับแนวคิดใน DDD
ยืดหยุ่นมากขึ้น
การใช้ @bean คุณสามารถสร้างอินสแตนซ์ของคลาสในไลบรารี หากคุณใช้ @Service คุณไม่สามารถเพิ่มคำอธิบายประกอบ @Service ลงในคลาสที่เกี่ยวข้องในไลบรารี
ความรู้น้อยที่สุด (หลักการความรู้ขั้นต่ำ)
หลักการความรู้ขั้นต่ำหมายถึง:
เทคโนโลยีหรือความรู้ที่น้อยกว่าที่จำเป็นในการทำงานให้เสร็จสมบูรณ์ยิ่งดีเพื่อให้แน่ใจว่าโครงการนั้นง่ายและลดความยากลำบากในการเรียนรู้โครงการ
เนื่องจากการใช้ @Service ไม่สามารถสร้างอินสแตนซ์ของคลาสในไลบรารีคลาสเมื่อพบข้อกำหนดที่คล้ายกันคุณต้องใช้รูปแบบของ @Configuration และ @Bean ในเวลานี้คำอธิบายประกอบเช่น @Service, @Configuration และ @Bean มีอยู่ในโครงการทั้งหมดในเวลาเดียวกันและสิ่งที่คำอธิบายประกอบเหล่านี้ทำเหมือนกันนั่นคือการสร้างถั่ว
ด้วย @Service มีโอกาสมากที่ @Service, @Component, @Configuration และ @Bean จะมีอยู่พร้อมกัน
เมื่อใช้ @Configuration และ @Bean คุณสามารถเพิกเฉยต่อ @Service และ @Component ซึ่งสอดคล้องกับหลักการของความรู้ขั้นต่ำ
ในที่สุดถั่วของฤดูใบไม้ผลิถูกสร้างขึ้นใน XML มาก่อนและ Java ถูกใช้สำหรับการกำหนดค่าในภายหลัง เหตุผลหลักที่ไม่ได้ใช้ XML คือ XML ไม่กระชับเพียงพอและไม่มีฟังก์ชั่นใด ๆ เช่นการตรวจสอบเวลาคอมไพล์แทนที่จะกระจายการสร้างถั่วลงในชั้นเรียนต่างๆ
โดยสรุปผู้เขียนชอบที่จะใช้ @configuration และ @bean
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น