Saat mengkonfigurasi beberapa sumber data menggunakan AbstractroutingDataSource, ditemukan bahwa DataSourcesWitchaspect yang dikonfigurasi menggunakan @Aspect selalu dieksekusi setelah transaksi deklaratif, dan konfigurasi pesanan masih tidak berfungsi. Setelah diselidiki, ditemukan bahwa itu karena metode proxy AOP yang tidak konsisten dari keduanya.
Di dalam musim semi, penciptaan otomatis agen diselesaikan melalui beanpostprocessor (diterjemahkan sebagai postprocessor dalam buku "Spring Guide". Menurut aturan pencocokan, itu secara kasar dibagi menjadi tiga kategori: 1. Secara otomatis membuat proxy untuk pencocokan kacang 2 secara otomatis. Implementasikan AnnotationAwareaspectJAutoproxyCreator 3. Secara otomatis membuat proxy berdasarkan mekanisme pencocokan penasihat.
Di antara mereka, AOP yang dinyatakan oleh @Aspect telah diproklikan melalui AnnotationAwareaspectJautoproxycreator, sedangkan transaksi deklaratif dalam proyek tersebut diproklikan oleh Beannameautoproxycreator. Setelah debugging, ditemukan bahwa prioritas intersepsi beannameautoproxycreator lebih tinggi daripada AnnotationAwareaspectjautoproxycreator. Konfigurasi pesanan hanya berfungsi untuk jenis metode intersepsi AOP yang sama, sebagai berikut:
DataSourceswitchaspect
/*** Sumber data switching facet* @author matchstick*/ @aspek @order (1) // Pastikan facet dieksekusi sebelum transaksi @ComponentPublic kelas DataSourcesWitchaspect {private Logger Logger = loggerFactory.getLogger (getClass ()); @Pointcut("@annotation(com.etu.multidatasource.test.datasource.DataSourceId)") public void pointcut(){} @Before("@annotation(dataSourceId)") public void switchDataSource(JoinPoint point, DataSourceId dataSourceId) { String dsId = dataSourceId.value(); MultidataSourContextholder.setDataSourceId (DSID); Logger.Debug ("Switch DataSource -> {}", dsid); } @After (" @annotation (DataSourceID)") public void restoredataSource (point joinpoint, DataSourceId DataSourceID) {MultiDataSourContExTholder.RemovedataSourceId (); logger.debug ("restore dataSource -> {}", multidataSourContextholder.getDefaultDataSourceId ()); }} DataSourCeConfig
@Bean Public BeannameAutoproxyCreator txproxy () {beanNeNeUutoproxyCreator creator = new BeanNeNeUutOproxyCreator (); creator.setIntercepToNTames ("TXAdvice"); creator.setBeanNames ("*service", "*serviceImpl"); creator.setProxyTargetClass (true); creator.setorder (2); Pencipta kembali; } Solusi: Baik memodifikasi metode AOP dari DataSourceSwitchaspect menjadi beannameautoproxycreator, atau memodifikasi metode transaksi AOP menjadi annotationAwareaspectjautoproxycreator. Karena switching sumber data AOP diaktifkan melalui anotasi, solusi terakhir dipilih, sebagai berikut:
DataSourCeConfig
@Bean AnnotationAwareaspectJautoproxycreator txproxy () { /** autoproxy dalam metode aspekj harus digunakan, sehingga untuk mempertahankan metode intersepsi AOP yang terpadu dengan data sumber data, jika tidak ada metode intersepsi yang berbeda = AnnotationAwareaspecpecpecpecpecpercorcection, jika tidak ada metode intersepsi yang berbeda* / AnnotationAspecpecpecpecpecpercorcorcore, ne baru. AnnotationAwareaspectjautoproxycreator (); C.SetInterCepToNTames ("TXAdvice"); c.setincludepatterns (arrays.aslist ("Eksekusi (com.etu publik ..*layanan (..))")); C.SetProxyTargetClass (true); c.setorder (2); kembali C; } Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.