При настройке нескольких источников данных с использованием AbstractroutingDataSource было обнаружено, что DataSourcesWitchAspect, настроенный с использованием @Aspect, всегда выполняется после декларативной транзакции, и конфигурация порядка все еще не работает. После расследования было обнаружено, что это было связано с противоречивыми прокси -методами AOP.
Внутри весны автоматическое создание агента завершено через Beanpostprocessor (перевод как постпроцессор в книге «Руководство по пружине». Согласно правилам сопоставления, оно примерно разделено на три категории: 1. Автоматически создает прокси для сопоставленного боба, чтобы соответствовать названию боба и реализовать Beannamautoproxecreator 2. Реализуйте класс AnnotationAwareSpectJautoproxycreator 3. Автоматически создание прокси на основе соответствующего механизма консультанта будет отсканирован, и эти разделы будут автоматически применяться к соответствующим бобам, а класс DefaultAdvisorautoproxycreator будет реализован.
Среди них AOP, объявленная @Asept, прокси через AnnotationAwareSpectjautoproxycreator, в то время как декларативные транзакции в проекте прокси -подражаются Beannameautoproxycreator. После отладки было обнаружено, что приоритет перехвата Beannameautoproxycreator выше, чем у Annotationawareaspectejautoproxycreator. Конфигурация заказа работает только для того же типа метода перехвата AOP следующим образом:
DataSourcesWitchAspect
/*** Фастроирование исходного источника данных* @author Matchstick*/ @asment @order (1) // Убедитесь, что аспект выполняется перед транзакцией @componentpublic class dataSourceswitchAspect {private logger = loggerFactory.getLogger (getClass ()); @Pointcut ("@annotation (com.etu.multidatasource.test.datasource.datasourceid)") public void pointcut () {} @before ("@annotation (dataSourceId)") public void switchDatasource (joantoptoint point, dataSourceid) {string dsId = dsAleId = dsAsId = {string dSID = {string dsId = writsid = writsid = writsid = writsid = writsid = vsaleid = writled woid) {stringdatid = vestud) Multidatasourcecontextholder.setdatasourceid (dsid); logger.debug ("Switch DataSource -> {}", DSID); } @After (" @annotation (dataSourceID)") public void restoredAtAsource (joinpoint point, dataSourceId dataSourceId) {multidatAsourceContexTholder.RemovatAtASourceID (); logger.debug ("RESTORE 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); вернуть создатель; } Решение: либо измените метод AOP DataSourcesWitchAspect, чтобы быть Beannameautoproxycreator, либо изменить метод транзакции AOP для аннотации AwareAspectejautoproxycreator. Поскольку AOP переключения источника данных переключается посредством аннотации, последнее решение выбирается следующим образом:
DataSourceConfig
@Bean Public AnnotationAwareSpectJautoproxycreator txproxy () { /** Автопроксие в методе аспекта должен быть использован, чтобы поддерживать единый метод перехвата AOP с DataSourcesWitchSepec AnnotationAwareSpectJautoproxycreator (); c.setInterceptornames ("txadvice"); c.setincludepatterns (arrays.aslist ("execution (public com.etu ..*service (..))")); C.SetProxyTargetClass (true); C.SetOrder (2); возврат C; } Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.