Al configurar múltiples fuentes de datos utilizando AbstrutingDataSource, se descubrió que DataSourceSwitchAspect configurado usando @Aspect siempre se ejecuta después de una transacción declarativa, y la configuración del orden aún no funciona. Después de la investigación, se descubrió que se debió a los métodos de proxy AOP inconsistentes de los dos.
Inside spring, the automatic creation of the agent is completed through BeanPostProcessor (translated as postprocessor in the book "Spring Guide". According to the matching rules, it is roughly divided into three categories: 1. Automatically create a proxy for the matching bean to match the name of the bean, and implement the class BeanNameAutoProxyCreator 2. Automatically create a proxy based on the AspectJ annotation in the bean, and implement the class AnnotationAwareAspectJAUTOProxyCreator 3. Cree automáticamente un proxy basado en el mecanismo de coincidencia del asesor.
Entre ellos, el AOP declarado por @Aspect está proxyed a través de AnnotationAweAspectJaUtoProxyCreator, mientras que las transacciones declarativas en el proyecto son indicadas por BeannameautoProxyCreator. Después de la depuración, se descubrió que la prioridad de intercepción del beannameautoproxycreator es más alta que la de AnnotationAwareaspectjautoProxycreator. La configuración del pedido solo funciona para el mismo tipo de método de intercepción de AOP, como sigue:
DataSourceSwitchAspect
/*** Faceta de cambio de fuente de datos* @author Matchstick*/ @aspecto @orden (1) // Asegúrese de que la faceta se ejecute antes de la transacción @ComponentPublic Class CourceSwitchAspect {private logger logger = loggerFactory.getLogger (getClass ()); @PointCut ("@annotation (com.etu.multiDataSource.test.datasource.dataSourceID)") public void PointCut () {} @bebefore ("@annotation (dataSourceId)") public void switchDataSource (punto de unión, punto, dataSourceID dataSourceID) {string dsid = dataSid = dataSource.valeue (); MultidataSourCeceTextholder.setDataSourceID (DSID); logger.debug ("Switch DataSource -> {}", dsid); } @After (" @annotation (dataSourceId)") public void restauredataSource (unión de punto de unión, dataSourceId dataSourceId) {multidataSourCeceTextholder.removedataSourceId (); logger.debug ("restaurar dataSource -> {}", multidataSourCeTexTholder.getDefaultDataSourceId ()); }} DataSourCeConfig
@Bean public beannameautOproxyCreator txproxy () {beannameautOproxyCreator Creator = new BeannameautOproxyCreator (); Creator.setInterceptOrnames ("TxAdVice"); creator.setBeanNames ("*Servicio", "*ServiceImpl"); Creator.setProxyTargetClass (verdadero); Creator.setOrder (2); Return Creator; } Solución: Modifique el método AOP de DataSourceSwitchAspect para que sea BeannameautoProxyCreator, o modifique el método de transacción AOP a AnnotationAwareAspectJaUtoProxyCreator. Dado que la fuente de datos de AOP se cambia a través de la anotación, la última solución se selecciona, como sigue:
DataSourCeConfig
@Bean Public AnnotationAweAspectJAUTOProxyCreator txProxy () { /** AutoProxi en el método de aspecto de aspecto debe usarse, para mantener un método de intercepción unificado de AOP con DataSourcesWitchAspect, de lo contrario, diferentes métodos de intercepción causarán falla de orden* / annotationAweAspectJaUtoproxycreator c = new New AnotationAwareAspectJaUtoProxyCreator (); C.SetIntercepTornames ("TxAdVice"); C.SetInCludePatterns (Arrays.aslist ("Ejecución (público com.etu ..*servicio (..))")); C.SetProxyTargetClass (verdadero); C.SetOrder (2); regreso c; } Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.