AbstractroutingDataSourceを使用して複数のデータソースを構成する場合、 @Aspectを使用して構成されたDataSourcesWitchaspectは、宣言的トランザクションの後に常に実行され、注文の構成はまだ機能しません。調査後、2つのAOPプロキシメソッドが一貫していないことが原因であることがわかりました。
Spring内では、エージェントの自動作成はBeanPostProcessor(本「Spring Guide」のポストプロセッサとして翻訳されます。一致するルールによれば、3つのカテゴリにほぼ分割されます。1。クラスAnnotationAwareaspectjautoproxycreator3。コンテナのすべてのアドバイザーがスキャンされ、これらのセクションが自動的に適用され、クラスのDefaultAdvisorautoproxycreatorが実施されます。
その中で、@Aspectによって宣言されたAOPは、AnnotationAwareaspectjautoproxycreatorを通じてプロキシ化されていますが、プロジェクトの宣言的取引はBeannameautoproxycreatorによってプロキシ化されています。デバッグ後、Beannameautoproxycreatorの傍受の優先順位は、AnnotationAwareaspectjautoproxycreatorのそれよりも高いことがわかりました。次のように、注文構成は同じタイプのAOP傍受方法に対してのみ機能します。
DataSourcesWitchaspect
/***データソースの切り替えファセット* @Author MatchStick*/ @Aspect @Order(1)//トランザクション@componentPublic Class DataSourcesWitchaspect {private logger logger = loggerfactory.getLogger(getClass()); @pointcut( "@annotation(com.etu.multidatasource.test.datasource.datasourceid)")public void pointcut(){} @before( "@annotation(datasourceid)")public void switkerdatasource(join point、datasourceid datasource) multidatasourcecontextholder.setdatasourceid(dsid); logger.debug( "Switch DataSource-> {}"、dsid); } @after( " @annotation(dataSourceid)")public void rustedatource(joinpoint point、dataSourceid dataSourceid){multidatasourcecontextholder.removedatasourceid(); logger.debug( "rustore 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); return creator; }解決策:DataSourcesSwitchSpectのAOPメソッドをBeannameAutoproxycreatorに変更するか、トランザクションAOPメソッドをAntationAwareaspectjautoproxycreatorに変更します。データソースの切り替えAOPは注釈によって切り替えられるため、次のように後者のソリューションが選択されます。
DataSourceConfig
@bean public annotationAwareaspecteppectjautoproxycreator txproxy(){ /** aspectjメソッドのAutoproxyを使用する必要があります。データソースウィッチの統一されたAOP傍受方法を維持するために、それ以外の場合は異なる傍受方法が順序障害を引き起こす* / annotationAwareaseptor c = new new new annotationawareaspectjautoproxycreator(); c.SetInterCeptorNames( "txadvice"); c.setIncludePatterns(arrays.aslist( "execution(public com.etu ..*service(..))")); C.SetProxyTargetClass(True); C.SetOrder(2); c; }上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。