Bei der Konfiguration mehrerer Datenquellen mithilfe von AbstractroutingDataSource wurde festgestellt, dass DataSources -SpecacePect -Konfiguration mit @aspect immer nach einer deklarativen Transaktion ausgeführt wird und die Konfiguration der Reihenfolge weiterhin nicht funktioniert. Nach der Untersuchung wurde festgestellt, dass dies auf die inkonsistenten AOP -Proxy -Methoden der beiden zurückzuführen war.
Im Frühjahr wird die automatische Schaffung des Agenten durch BeanPostProcessor abgeschlossen (übersetzt als Postprozessor im Buch "Spring Guide". Nach den passenden Regeln ist es grob in drei Kategorien unterteilt: 1. Erstellen Sie automatisch einen Proxy für die passende Bean, um den Namen der Bean zu implementieren. Bean und implementieren Sie die KlassenannotationAwareasspectjautoproxyCreator.
Unter ihnen wird die von @aspect deklarierte AOP durch AnnotationAwareasspectjautoproxyCreator, während die deklarativen Transaktionen des Projekts von BeannameAutoproxyCreator vervollständigt werden. Nach dem Debuggen wurde festgestellt, dass die Abfangen -Priorität von BeannameAutoproxyCreator höher ist Die Bestellkonfiguration funktioniert nur für denselben Typ von AOP -Interception -Methoden wie folgt:
DataSourcesWitchaspect
/*** Datenquellen -Switching Facette* @author MatchStick*/ @Aspekt @order (1) // Stellen Sie sicher, dass die Facette vor der Transaktion @ComponentPublic class DataSourcesWitchaspect ausgeführt wird {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 dataSourceId) { String dsId = dataSourceId.value(); MultidataSourceContextHolder.SetDataSourceid (DSID); logger.debug ("DataSource Switch -> {}", dsid); } @After (" @Annotation (DataSourceid)") public void restauredataSource (JoinPoint Point, DataSourceid DataSourceid) {MultidataSourceContextHolder.Removedatasourceid (); logger.debug ("DataSource wiederherstellen -> {}", MultidataSourceContextHolder.getDefaultDataSourceid ()); }} DataSourceConfig
@Bean public BeannameAutoproxyCreator txproxy () {BeannameAutoproxyCreator Creator = New BeannameAutoproxyCreator (); Creator.SetInterceptorNames ("txadvice"); Creator.setBeannames ("*Service", "*serviceImpl"); Creator.setProxytargetClass (true); Creator.SetOrder (2); Schöpfer zurückgeben; } Lösung: Ändern Sie entweder die AOP -Methode von DataSourcesWitchaspect so, um beannameAutoproxycreator zu sein, oder ändern Sie die Transaktions -AOP -Methode in AnnotationAwArepectJautoproxyCreator. Da die Datenquellenschaltung AOP durch Annotation umgeschaltet wird, wird die letztere Lösung wie folgt ausgewählt:
DataSourceConfig
@Bean Public AnnotationAwareasspectJautoproxyCreator txproxy () { /** autoproxy in Aspekte AnnotationAweAtepectJautoproxyCreator (); C.SetInterceptorNames ("txadvice"); C.SetIncludepasserns (arrays.aslist ("Ausführung (öffentlicher com.etu ..*service ()") ")); C.SetProxytargetClass (true); C.Setorder (2); Rückkehr C; } Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.