เมื่อกำหนดค่าแหล่งข้อมูลหลายแหล่งโดยใช้ abstractroutingDataSource พบว่าแหล่งข้อมูล Witchaspect ที่กำหนดค่าโดยใช้ @Aspect จะถูกดำเนินการเสมอหลังจากการทำธุรกรรมที่ประกาศและการกำหนดค่าของคำสั่งซื้อยังไม่ทำงาน หลังจากการสอบสวนพบว่ามันเป็นเพราะวิธีการพร็อกซี AOP ที่ไม่สอดคล้องกันของทั้งสอง
ภายในฤดูใบไม้ผลิการสร้างเอเจนต์อัตโนมัติเสร็จสมบูรณ์ผ่าน BeanPostProcessor (แปลว่าเป็นตัวประมวลผลในหนังสือ "Guide" ตามกฎการจับคู่มันจะแบ่งออกเป็นสามประเภท: 1. สร้างพร็อกซีสำหรับการจับคู่ ถั่วและใช้คำอธิบายประกอบคลาส ANNOTATIONARASPECTJAUTOPROXYCREATOR 3. สร้างพร็อกซีโดยอัตโนมัติตามกลไกการจับคู่ของที่ปรึกษา
ในหมู่พวกเขา AOP ที่ประกาศโดย @aspect นั้นถูก proxyed ผ่าน AnnotationawareaspectJautoproxycreator ในขณะที่การทำธุรกรรมที่ประกาศในโครงการจะถูก proxyed โดย Beannameautoproxycreator หลังจากการดีบักพบว่าลำดับความสำคัญของการสกัดกั้นของ Beannameautoproxycreator นั้นสูงกว่าคำอธิบายประกอบของคำอธิบายประกอบ การกำหนดค่าคำสั่งซื้อใช้งานได้เฉพาะวิธีการสกัดกั้น AOP ประเภทเดียวกันดังต่อไปนี้:
DataSourceswitchaspect
/*** facet switching แหล่งข้อมูล* @author matchstick*/ @ @user @order (1) // ตรวจสอบให้แน่ใจว่า facet ถูกดำเนินการก่อนการทำธุรกรรม @componentpublic คลาส dataSourceswitchaspect {private logger logger = loggerFactory.getLogger (getClass (); @PointCut ("@Annotation (com.etu.multidataSource.test.datasource.datasourceid)") โมฆะสาธารณะ pointcut () {} @before ("@annotation (dataSourceid)") public void switchdatasource MultidatasourceContextholder.setDataSourceId (DSID); logger.debug ("Switch DataSource -> {}", dsid); } @after (" @annotation (dataSourceId)") โมฆะสาธารณะ restoredAtAsource (จุด JoinPoint, DataSourceId DataSourceId) {MultidataSourceContextholder.removedataSourceId (); logger.debug ("กู้คืน dataSource -> {}", multidataSourceContextholder.getDefaultDataSourceId ()); - DataSourceConfig
@bean สาธารณะ Beannameautoproxycreator txproxy () {Beannameautoproxycreator ผู้สร้าง = ใหม่ Beannameautoproxycreator (); creator.setInterceptornames ("txadvice"); creator.setBeanNames ("*Service", "*ServiceImpl"); creator.setProxytargetClass (จริง); creator.setOrder (2); ผู้สร้างกลับมา; - วิธีแก้ปัญหา: แก้ไขวิธี AOP ของแหล่งข้อมูล Witchaspect เป็น beannameautoproxycreator หรือปรับเปลี่ยนวิธีการทำธุรกรรม AOP เป็น AnnotationawareAspectJautoproxycreator เนื่องจากแหล่งข้อมูลการสลับ AOP ถูกสลับผ่านคำอธิบายประกอบการแก้ปัญหาหลังจึงถูกเลือกดังนี้:
DataSourceConfig
@bean Public AnnotationawareaspectJautoproxycreator txproxy () { /** autoproxy ในวิธีการจะต้องใช้วิธีการเพื่อรักษาวิธีการสกัดกั้น AOP แบบครบวงจรด้วย DataSourceswitchaspect AnnotationAwareaspectJautoproxycreator (); C.SetInterceptornames ("txadvice"); c.setincludepatterns (array.aslist ("การดำเนินการ (สาธารณะ com.etu ..*บริการ (.. ))")); C.SetProxytargetClass (จริง); C.SetOrder (2); กลับ C; - ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น