Dévoilement de la magie transactionnelle de Spring
L'annotation des méthodes avec @Transactional déclenche Spring pour créer une classe proxy pour intercepter les appels de méthode entrants. Voici comment cela fonctionne :
Création et structure de classe proxy
Spring crée une classe proxy qui implémente les mêmes interfaces que la classe annotée. La classe proxy est une classe générée dynamiquement qui encapsule la classe d'origine. À l'intérieur de la classe proxy, Spring injecte du code pour gérer le comportement transactionnel, tel que la gestion du cycle de vie d'une transaction.
L'instance réelle de la classe d'origine n'est pas affectée. Elle reste intacte, mais les appels de méthode à la classe d'origine sont interceptés par la classe proxy.
Visibilité de la classe proxy
La classe proxy est généralement invisible au moment de l'exécution. Spring intercepte de manière transparente les appels de méthode via le proxy, donnant l'impression que la classe d'origine est invoquée. Cependant, vous pouvez accéder à la classe proxy à l'aide d'outils tels que des outils de débogage ou des frameworks AOP.
Portée de transaction limitée pour les appels internes
Les proxys transactionnels de Spring n'interceptent que les appels provenant de sources externes. Les appels effectués au sein du même objet, également appelés « auto-invocation », ne sont pas interceptés. En effet, de tels appels contournent le mécanisme de proxy.
Solution de contournement d'auto-invocation
Pour activer le comportement transactionnel pour les méthodes d'auto-invocation, vous pouvez injecter une instance du proxy classe dans la classe auto-référencée à l’aide d’un BeanFactoryPostProcessor. Cela vous permet de diriger les appels internes via le proxy, étendant ainsi la portée transactionnelle aux méthodes d'auto-invocation.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!