我有一個問題,它與我遇到的錯誤有關。在我的服務中有一個回圈參考到底有多糟糕?我非常清楚錯誤是由什么引起的以及如何解決它,只是在我作業的公司中,一位資深人士向我推薦,對于交易問題,有必要進行這樣的回圈參考,實際上這是一個非常經常發生的問題在那里練習,但是當我從頭開始一個個人專案時,這是我第一次遇到錯誤,它再次引發了懷疑。非常感謝您!

這是服務的代碼
public class MedicalRecordServiceImpl implements MedicalRecordService {
private final MedicalRecordRepository medicalRecordRepository;
private final MedicalRecordService medicalRecordService;
private final PatientService patientService;
private final TutorService tutorService;
private final MedicalHistoryAnswerService medicalHistoryAnswerService;
private final DentalHistoryAnswerService dentalHistoryAnswerService;
public MedicalRecordServiceImpl(MedicalRecordRepository medicalRecordRepository, MedicalRecordService medicalRecordService, PatientService patientService, TutorService tutorService, MedicalHistoryAnswerService medicalHistoryAnswerService, DentalHistoryAnswerService dentalHistoryAnswerService) {
this.medicalRecordRepository = medicalRecordRepository;
this.medicalRecordService = medicalRecordService;
this.patientService = patientService;
this.tutorService = tutorService;
this.medicalHistoryAnswerService = medicalHistoryAnswerService;
this.dentalHistoryAnswerService = dentalHistoryAnswerService;
}
@Override
@Transactional(propagation = Propagation.REQUIRED)
public void saveMedicalRecord(MedicalRecordEntity medicalRecord) {
medicalRecordRepository.save(medicalRecord);
}
@Override
@Transactional(propagation = Propagation.REQUIRED)
public ResponseEntity<?> createNewMedicalRecord(MedicalRecordDTO medicalRecordDTO) {
PatientEntity patient = this.storeMedicalRecordIntoPatient(medicalRecordDTO);
TutorEntity tutor = this.storeMedicalRecordIntoTutor(medicalRecordDTO);
List<MedicalHistoryAnswerEntity> medicalHistoryAnswers = this.storeMedicalRecordIntoMedicalHisAns(medicalRecordDTO);
List<DentalHistoryAnswerEntity> dentalHistoryAnswers = this.storeMedicalRecordIntoDentalHisAns(medicalRecordDTO);
patientService.savePatient(patient);
tutor.setPatient(patient);
tutorService.saveTutor(tutor);
MedicalRecordEntity medicalRecord = this.createMedicalRecord(patient, tutor);
medicalRecordService.saveMedicalRecord(medicalRecord);
medicalHistoryAnswers.forEach(medicalHistoryAnswer -> {
medicalHistoryAnswer.setMedicalRecord(medicalRecord);
medicalHistoryAnswerService.saveMedicalHistoryAnswer(medicalHistoryAnswer);
});
dentalHistoryAnswers.forEach(dentalHistoryAnswer -> {
dentalHistoryAnswer.setMedicalRecord(medicalRecord);
dentalHistoryAnswerService.saveDentalHistoryAnswer(dentalHistoryAnswer);
});
return ResponseEntity.status(HttpStatus.OK).body("");
}
}
uj5u.com熱心網友回復:
您可能需要回圈依賴的唯一原因是當您訪問 bean 的“this”以觸發帶注釋的方法邏輯時。
例如,如果您有兩個方法“foo”(使用@Transactional 注釋)和“bar”(在其中呼叫“foo”)。如果呼叫 bar>foo(selfBean.foo() 而不是 this.foo()),您將不得不使用自注入來觸發事務。
您也可以使用@Lasy 進行自我注入以避免回圈依賴錯誤。
但這是一個非常丑陋的解決方案,如果可能的話,你應該避免它。這取決于情況,可能會將邏輯拆分到不同的服務或使用 TransactionTemplate。
uj5u.com熱心網友回復:
正如您所說,我假設您知道錯誤是什么以及如何解決它。回圈參考不好,原因如下:
Spring 在您啟動專案的那一刻加載 bean,這意味著它以正確的順序加載每個 bean,因此它可以加載所有 bean 并成功參考它們。如果您有回圈參考,Spring 將不知道首先從哪個 bean 開始,因此會發生錯誤。這是關于 Spring 是如何作業的。
我在當前專案中也遇到了這個錯誤,您不僅限于不進行回圈參考,您只需要指示 Spring,以便它知道在這些情況下如何處理每個 bean。
uj5u.com熱心網友回復:
好吧,想象一下:你得到了一部新手機,你們都很興奮。您想解鎖它,但它受密碼保護。密碼可在鎖定手機的筆記中找到。
所以,你想使用你的手機,因為它你需要通行證。你想要通行證,因為你需要解鎖手機。你想使用你的手機,因為它你需要你的通行證......等等。
當您有回圈參考時也會發生同樣的情況,對于 A,您需要 B,對于 B,您需要 A,因此您無法創建 A,也無法創建 B,也無法繼續。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/484324.html
