Ao configurar várias fontes de dados usando abstractrotingDataSource, verificou -se que o DataSourceswitchaspect configurado usando @aspect sempre é executado após uma transação declarativa, e a configuração da ordem ainda não funciona. Após a investigação, verificou -se que era devido aos métodos inconsistentes de proxy da AOP dos dois.
Dentro da primavera, a criação automática do agente é concluída através do beanPostProcessor (traduzido como pós -processador no livro "Spring Guide". De acordo com as regras correspondentes, é dividido aproximadamente em três categorias: 1. Criar automaticamente um proxy para o BEAN correspondente para o nome do Bean. Bean e implemente a classe AnoTationAwarEaspeSpectJautoProxycreator 3. Crie automaticamente um proxy com base no mecanismo de correspondência do consultor.
Entre eles, a AOP declarada pelo @Aspect é proxyed por meio de anotaçãowareaspectJautoProxycreator, enquanto as transações declarativas no projeto são procuradas pelo Beannameauoutoproxycreator. Após a depuração, verificou -se que a prioridade de interceptação do beannameaupoproxycreator é maior que a do anotaçõesawareaspeaPoutoProxycreator. A configuração do pedido funciona apenas para o mesmo tipo de método de interceptação de AOP, como segue:
DataSourceswitchaspect
/*** Faceta de comutação da fonte de dados* @Author MatchStick*/ @aspecto @order (1) // verifique se a faceta é executada antes da transação @ComConenterPublic Class DataSourceswitchaspect {private logger logger = loggerFactory.getLogger (getClass ()); @PointCut ("@anotação (com.etu.multidataSource.test.datasource.datasourceid)") public void Pointcut () {} @Before ("@AnnoTation (DataSourceId)) public void DuxtAdATAsource (JONPoint, DataSourceId) MultidatasourceContextholder.SetDataSourceId (DSID); Logger.debug ("Switch DataSource -> {}", dsid); } @After (" @annotation (dataSourceId)") public void restauredataSource (ponto de junta, DataSourceId DataSourceId) {multidatasourceContextholder.removedataSourCeId (); Logger.debug ("RESTORE DATASOURCE -> {}", multidatasourceContextholder.getDefaultDataSourceId ()); }} DataSourceConfig
@Bean Public BeannameautoProxycreator txProxy () {BeannameautoProxycreator Creator = New BeannameautoProxyCreator (); Creator.SetInterceptorNames ("Txadvice"); Creative.SetBeanNames ("*serviço", "*serviceImpl"); Creator.SetProxyTargetClass (true); Creator.setorder (2); Retorn Creator; } Solução: Modifique o método AOP de DataSourceswitchAspect para ser BeannameautoProxycreator ou modifique o método da transação AOP para anotareaspectJautoProxycreator. Como a AOP de comutação da fonte de dados é alterada por anotação, a última solução é selecionada, como segue:
DataSourceConfig
@Bean public AnnotationAwareAspectJAutoProxyCreator txProxy() { /* * AutoProxy in AspectJ method must be used, so as to maintain a unified aop interception method with DataSourceSwitchAspect, otherwise different interception methods will cause order failure*/ AnnotationAwareAspectJAutoProxyCreator c = new AnotaçãowareaspectJautoProxycreator (); c.setInterceptorNames ("txadvice"); C.SetincludePatterns (Arrays.asList ("Execução (public com.etu ..*Service (..))")); c.setProxyTargetClass (true); C.setorder (2); retornar c; } O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.