หากใช้การฉีดคอนสตรัคเตอร์สถานการณ์การพึ่งพาแบบวงกลมที่ไม่สามารถแยกวิเคราะห์ได้
การพึ่งพาเป็นวงกลมคืออะไร
การพึ่งพาแบบวงกลมเป็นการอ้างอิงแบบวงกลมจริงนั่นคือถั่วสองตัวขึ้นไปถือกันและในที่สุดก็กลายเป็นวงปิด ตัวอย่างเช่น A ขึ้นอยู่กับ B, B ขึ้นอยู่กับ C และ C ขึ้นอยู่กับ A. ดังที่แสดงในรูปด้านล่าง:
โปรดทราบว่านี่ไม่ใช่การเรียกวนลูปไปยังฟังก์ชั่น แต่เป็นการพึ่งพาซึ่งกันและกันของวัตถุ การโทรแบบวนซ้ำเป็นแบบวนซ้ำที่ตายแล้วเว้นแต่จะมีเงื่อนไขสิ้นสุด
มีสถานการณ์การพึ่งพาวนวนในฤดูใบไม้ผลิ:
(1) การพึ่งพาแบบวงกลมของตัวสร้าง (2) การพึ่งพาวงกลมของแอตทริบิวต์สนาม
วิธีตรวจสอบว่ามีการพึ่งพาเป็นวงกลม
มันค่อนข้างง่ายที่จะตรวจจับการพึ่งพาวงกลม เมื่อถั่วถูกสร้างขึ้นมันสามารถทำเครื่องหมายถั่วได้ หากการโทรแบบเรียกซ้ำกลับมาและพบว่ากำลังถูกสร้างขึ้นนั่นหมายความว่าการพึ่งพาแบบวงกลมคือ
นี่คือสถานการณ์ที่ฉันพบโครงสร้างรหัสมีดังนี้:
คลาสการกำหนดค่า Springsecurity:
@ConfigurationPublic คลาส BrowsersecurityConfig ขยาย WebSecurityConfigurerAdapter {ส่วนตัว UserDetailsService UserDetailsService; / ** * inject userDetailsService ผ่านตัวสร้างคลาสการกำหนดค่า */ @autowired Public BrowsersecurityConfigFig (userDetailsService userDetailSservice) {this.userDetailService = UserDetailService; } / ** * ประกาศตัวเข้ารหัสเข้ารหัสในคลาสการกำหนดค่า * / @bean รหัสผ่านสาธารณะรหัสผ่านรหัสผ่าน () {ส่งคืน bcryptpasswordencoder ใหม่ (); -UserDetailsService Class:
@ComponentPublic Class MyUserDetailService ใช้ UserDetailsService {รหัสผ่านสุดท้ายรหัสผ่านสุดท้ายรหัสผ่าน ตัวบันทึกส่วนตัว logger = loggerFactory.getLogger (getClass ()); / ** * ฉีดรหัสผ่านผ่านตัวสร้าง */ @autowired สาธารณะ myuserDetailService (รหัสผ่านรหัสผ่าน) {this.passwordencoder = passwordencoder; -หลังจากทำงานแล้วสปริงจะส่งข้อความแสดงข้อผิดพลาดต่อไปนี้:
คำอธิบาย:
การพึ่งพาของถั่วบางชนิดในบริบทแอปพลิเคชันเป็นวัฏจักร:
- BrowsersecurityConfig ที่กำหนดไว้ในไฟล์ [d: /code/java/ideprojects/mango-security/mango-security-browser/target/classes/stu/mango/security/browser/browsersecuritycurity
- MyuserDetailService ที่กำหนดไว้ในไฟล์ [D: /code/java/ideProjects/mango-security/mango-security-browser/target/classes/stu/mango/security/browser/myuserdetailservice.class]
ในตัวอย่างนี้ BrowsersecurityConfig จะฉีดอินสแตนซ์ UserDetailSservice ผ่านตัวสร้างและผู้ใช้งาน Service จะถูกฉีดเข้าไปในรหัสผ่านที่ประกาศไว้ใน BrowsersecurityConfigFig ผ่านตัวสร้าง
โดยสรุปการพึ่งพาวงกลมของถั่วฤดูใบไม้ผลิหมายความว่าคลาส A จำเป็นต้องฉีดอินสแตนซ์ของคลาส B (หรือถั่วที่ประกาศใน B) ลงในคอนสตรัคเตอร์ในขณะที่คลาส B จำเป็นต้องฉีดอินสแตนซ์ของคลาส A (หรือถั่วประกาศใน A) ลงในคอนสตรัคเตอร์ หากถั่วของคลาส A และคลาส B ได้รับการกำหนดค่าให้ฉีดเข้าหากันคอนเทนเนอร์สปริง IOC จะตรวจจับการอ้างอิงลูปนี้ที่รันไทม์และเพิ่ม beancurrentlyincreationException ซึ่งแตกต่างจากกรณีทั่วไป (โดยไม่มีการพึ่งพาเป็นวงกลม) การพึ่งพาวงกลมระหว่างถั่ว A และถั่ว B บังคับให้หนึ่งในถั่วที่จะถูกฉีดเข้าไปในอีกอันก่อนที่จะเริ่มต้นอย่างเต็มที่ (นี่เป็นสถานการณ์ "ไก่ก่อนหรือไข่แรก"
สารละลาย
เพื่อให้ง่ายมันจะไม่ใช้การฉีดพึ่งพาตัวสร้าง มันสามารถแก้ไขได้ด้วยวิธีการต่อไปนี้
ใช้คำอธิบายประกอบ @autowired บนสนามและปล่อยให้ฤดูใบไม้ผลิตัดสินใจที่จะฉีดในเวลาที่เหมาะสม 【แนะนำ】
แทนที่การฉีดขึ้นอยู่กับการพึ่งพาของตัวสร้างด้วยการฉีดพึ่งพาตามตัวสร้างเพื่อแก้ปัญหาการพึ่งพาเป็นวงกลม
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น