AbstractroutingDatasource를 사용하여 여러 데이터 소스를 구성 할 때 @aspect를 사용하여 구성된 DataSourcesWitchAspect는 항상 선언적 트랜잭션 후에 실행되며 주문 구성은 여전히 작동하지 않습니다. 조사 후, 그것은 두 사람의 일관되지 않은 AOP 프록시 방법 때문인 것으로 밝혀졌다.
스프링 내부에서 에이전트의 자동 생성은 BeanPostProcessor (책 "스프링 가이드"에서 후 프로세서로 번역되어 있습니다. 일치하는 규칙에 따르면, 그것은 대략 세 가지 범주로 나뉘어져 있습니다. 1. 1. 콩의 이름을 일치시키기 위해 일치하는 Bean의 프록시를 자동으로 생성하고, BeanMaeAutoProxycreator 2를 구현하고, 측면을 기반으로하는 Prox를 구현합니다. Class AnnotationAwareaspectjautoProxycreator 3. 컨테이너의 모든 고문이 스캔되며 이러한 섹션은 자동으로 일치하는 Bean에 적용되며 클래스 DefaultAdvisoraUtoProxyCreator가 자동으로 적용됩니다.
그 중 @aspect가 선언 한 AOP는 AnnotationAwareaspectjautoProxycreator를 통해 근접한 반면, 프로젝트의 선언 트랜잭션은 BeannameaUutoProxyCreator에 의해 근접합니다. 디버깅 후, Beannameauutoproxycreator의 차단 우선 순위는 AnnotationAweReaspectjautoproxycreator보다 높다는 것이 밝혀졌습니다. 주문 구성은 다음과 같이 동일한 유형의 AOP 차단 방법에 대해서만 작동합니다.
DataSourcesWitchAspect
/*** 데이터 소스 스위칭 패싯* @Author matchstick*/ @asser @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 (joinpoint point, joinpoint point, dataSourceid dataSourceid) {dataSourceid =); MultidatasourceContexTholder.SetDatasourceid (DSID); logger.debug ( "스위치 데이터 소스 -> {}", dsid); } @After ( " @annotation (dataSourceId)") public void restoredAtasource (joinpoint point, dataSourceId dataSourceId) {multidatasourceContexTholder.RemovedAtAsourceId (); logger.debug ( "복원 DataSource-> {}", multidatasourcecontextholder.getDefaultDatasourceid ()); }} DataSourceConfig
@bean public beannameautoproxycreator txproxy () {beannameautoproxycreator creator = new Beannameautoproxycreator (); creator.setintercrepornames ( "txadvice"); creator.setBeanNames ( "*service", "*serviceimpl"); Creator.setProxyTargetClass (True); Creator.Setorder (2); 리턴 제작자; } 솔루션 : DataSourcesWitchAspect의 AOP 메소드를 BeannameautoProxyCreator로 수정하거나 Transaction AOP 메소드를 AnnotationAwareaspectjautoProxycreator로 수정하십시오. 데이터 소스 스위칭 AOP가 주석을 통해 전환되므로 후자의 솔루션은 다음과 같이 선택됩니다.
DataSourceConfig
@bean public annotationawareaspectjautoproxycreator txproxy () { /** Autoproxy는 측면에서 사용되어야합니다. 데이터가 사용하여 DataSourcesWitchAspect를 사용하여 통합 AOP 인터 셉션 방법을 유지하기 위해 사용해야합니다. 그렇지 않으면 다른 상호 작용 방법이 순서 실패를 일으킬 것입니다* / AnnotationAwareaspectOproxycreator C = 새로운 engateationAprodoprodoprodoprodoprodoprodoproceator (); c.setinterceptornames ( "txadvice"); c.setIncludePatterns (arrays.aslist ( "execution (public com.etu ..*service (..)"); C.SETPROXYTARGETCLASS (True); C. 세터 (2); 반환 c; } 위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.