la navigation
1. Qu’est-ce que la dépendance circulaire ?
La dépendance circulaire fait référence à la situation dans laquelle deux modules ou plus ont des dépendances et des appels mutuels, ce qui entraîne l'incapacité de ces modules à se compiler et à s'exécuter indépendamment.
1.1 Interdépendance
L'interdépendance est le problème d'erreur de dépendance le plus courant dans le développement. Lorsque l'interdépendance se produit, une erreur comme le montre la figure sera automatiquement signalée au démarrage : Il s'agit d'un problème rencontré au cours du processus de développement,
et comme le montre la figure Comme indiqué ici, slDispatchingServiceImpl dépend de slStoreOutWorkServiceImpl, et slStoreOutWorkServiceImpl dépend de slDispatchingServiceImpl, ce qui conduit à un problème d'interdépendance.
1.2 Dépendance entre les trois
Cela signifie que A dépend de B, B dépend de C et C dépend de A. Par conséquent, bien qu’il n’y ait pas de problème de dépendance circulaire entre les deux, les trois dépendent en réalité l’un de l’autre.
1.3 Autonomie
Cela signifie que A dépend de A
2. Solutions
2.1 Analyse
Spring a en fait conçu un cache à trois niveaux pour résoudre le problème de dépendance circulaire. Lorsque nous appelons getBean(), Spring trouvera d'abord le bean cible dans le cache de premier niveau. S'il n'est pas trouvé, il le recherchera dans le second. -niveau cache. Il n'a pas encore été trouvé. Cela signifie que le bean cible n'a pas été instancié, donc Spring instanciera le bean cible. S'il n'y a pas de dépendance circulaire, le bean sera placé dans le cache de deuxième niveau (au début bean). Sinon, le bean sera marqué comme ayant une dépendance circulaire et attendra le prochain tour. Affectation de requête, c'est-à-dire analyser les annotations Autowired. Une fois l'affectation de l'annotation terminée, la cible est stockée dans le cache de premier niveau.
2.2 Planification
À en juger par l'image ci-dessus, il est en fait évident que l'erreur est causée par la dépendance mutuelle des deux couches de service. Ensuite, jetez un œil aux deux couches de service. À première vue, oh, c'est effectivement dépendant. À l'heure actuelle, nous pouvons modifier un
certain service pour résoudre le problème de l'interdépendance. Par exemple, j'ai résolu le problème de la dépendance circulaire en rétrogradeant le service vers un mappeur.
@Resource
private SlDispatchingMapper dispatchingMapper;