Lors de la configuration de plusieurs sources de données à l'aide d'AbstractroutingDataSource, il a été constaté que DataSourceswitchaSpect configuré à l'aide de @aspect est toujours exécuté après une transaction déclarative, et la configuration de l'ordre ne fonctionne toujours pas. Après enquête, il a été constaté que cela était dû aux méthodes de proxy AOP incohérentes des deux.
À l'intérieur du printemps, la création automatique de l'agent est terminée via BeanPostProcessor (traduit par postprocesseur dans le livre "Spring Guide". Selon les règles de correspondance, il est à peu près divisé en trois catégories: 1. Créez automatiquement un proxy pour le farine assorti pour correspondre au nom du haricot, et implémentez la classe BeannameAutoproxycrecor 2. Class AnnotationAwaReSpectJautoproxyCreator 3. Créez automatiquement un proxy basé sur le mécanisme de correspondance du conseiller.
Parmi eux, l'AOP déclaré par @aspect est proxyé par annotationawareaspectjautoproxycreator, tandis que les transactions déclaratives du projet sont procurées par BeannameAutoproxycreator. Après le débogage, il a été constaté que la priorité d'interception du BeannameAutoproxycreator est plus élevée que celle de l'annotationawareaspectjautoproxycreator. La configuration de la commande ne fonctionne que pour le même type de méthode d'interception AOP, comme suit:
DataSourceswitchaspect
/ ** * FACET DE COMMUTATION DE SOURCE DE DONNÉES * @Author MatchStick * / @ Aspect @ Order (1) // Assurez-vous que la facette est exécutée avant la transaction @ComponentPublic Class DataSourcesWitchAspect {private logger logger = loggerFactory.getLogger (getClass ()); @Pointcut ("@ annotation (com.etu.multidatasource.test.datasource.datasourceid)") public void PointCut () {} @Before ("@ annotation (dataSourceid)") public void switchDataSource (joinpoint point, datasourceid (); MultidatasourceContexTholder.setDataSourceId (DSID); logger.debug ("Switch dataSource -> {}", dsid); } @After ("@ annotation (dataSourceId)") public void restaureDataSource (joinpoint point, dataSourceid dataSourceid) {multidataSourceContexTholder.RemovedAtaSourceId (); logger.debug ("restaurer dataSource -> {}", multidatasourceContexTholder.getDefaultDataSourceId ()); }} DataSourceConfig
@Bean public beannameAutoproxyCreator txproxy () {BeannameAutoproxyCreator Creator = new BeannameAutoproxyCreator (); Creator.setInterceptorNames ("txAdvice"); Creator.SetBeanNames ("* Service", "* ServiceImpl"); creator.setProxyTargetClass (true); Creator.SetOrder (2); return Creator; } Solution: Modifiez la méthode AOP de DataSourceswitchAspect pour être BeanNameAutoproxyCreator, soit modifier la méthode AOP de transaction pour annotationAwaReSpectJAutoproxyCreator. Étant donné que le commutateur de la source de données AOP est commuté dans l'annotation, cette dernière solution est sélectionnée, comme suit:
DataSourceConfig
@Bean Public AnnotationAwaReSpectJautoproxyCreator txproxy () {/ * * Autoproxy dans la méthode AspectJ doit être utilisé, afin de maintenir une méthode d'interception AOP unifiée avec DataSourceswitchaspect, sinon différentes méthodes d'interception provoqueront une défaillance des commandes * / AnnotationAwaReSpectJautoproxycreator C = new AnnotationAwaReaspectJautoproxyCreator (); C.SetInterceptorNames ("txAdvice"); C.SetcludePatterns (arrays.aslist ("EXECUTION (public com.ettu .. * Service (..))")); C.SetProxyTargetClass (true); C.SetOrder (2); Retour C; } Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.