عند تكوين مصادر بيانات متعددة باستخدام AbstRactRoutingDataSource ، تبين أن DataSourceSwitchaspect يتم تكوينه باستخدام ASPECT يتم تنفيذه دائمًا بعد معاملة إعلانية ، ولا يزال تكوين الطلب لا يعمل. بعد التحقيق ، تبين أنه كان بسبب أساليب وكيل AOP غير المتسقة للاثنين.
داخل الربيع ، يتم الانتهاء من الإنشاء التلقائي للوكيل من خلال BeanpostProcessor (ترجمت كمعالج ما بعد المعالج في كتاب "دليل الربيع". وفقًا لقواعد المطابقة ، يتم تقسيمه تقريبًا إلى ثلاث فئات: 1. annotationawareaspectjautoproxycreator 3. سيتم مسح وكيل تلقائيًا بناءً على آلية المطابقة للمستشار.
من بينها ، يتم تعبير AOP الذي أعلنه ASPECT من خلال التعليقات التوضيحية CorteCeptJautoproxyCreator ، في حين أن المعاملات التعريفية في المشروع يتم تجهيزها بواسطة Beannameautoproxycreator. بعد تصحيح الأخطاء ، وجد أن أولوية اعتراض beannameautoproxycreator أعلى من تلك الخاصة بالتعليقات التوضيحية. لا يعمل تكوين الطلب إلا لنفس نوع طريقة اعتراض AOP ، على النحو التالي:
DataSourceSwitchaspect
/*** تبديل مصدر البيانات Facet* Author MatchStick*/ @Quality @order (1) // تأكد من تنفيذ FACET قبل المعاملة componentpublic class datasourgeswitchaspect {private logger logger = loggerfactory.getLogger (getClass ()) ؛ @pointcut ("@annotation (com.etu.multidatasource.test.datasource.datasourceid)") public void pointcut () {}@fore ("@enoTation (dataSourceId)") public void switchdataSource (point point ، dataSourceId) multidatasourceContextholder.setDatasourceId (dsid) ؛ logger.debug ("Switch DataSource -> {}" ، dsid) ؛ } After (" @enrotation (dataSourceId)") public void resporataSource (Joinpoint Point ، dataSourceId SourceId) {multidatasourceContextholder.removeDataSourceId () ؛ logger.debug ("استعادة 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 المعاملة إلى incontationawareaspectjautoproxycreator. نظرًا لأن تبديل مصدر البيانات يتم تبديل AOP من خلال التعليق التوضيحي ، يتم تحديد الحل الأخير ، على النحو التالي:
DataSourCeConfig
Bean public annotationawareaspectjautoproxycreator txproxy () { /** autoproxy في طريقة الجوانب يجب أن تستخدم ، وذلك للحفاظ anotationawareaspectjautoproxycreator () ؛ C.SetInterceptorNames ("TxAdvice") ؛ C.SetInCluDepatterns (Arrays.aslist ("التنفيذ (public com.etu ..*service (..))")) ؛ C.SetProxyTargetClass (صواب) ؛ C.Setorder (2) ؛ العودة ج. } ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.