Saya ingin memantau semua metode publik dari semua Kelas dengan anotasi yang ditentukan (misalnya @Monitor) (catatan: Anotasi ada di level kelas). Apa yang bisa menjadi titik tolak yang mungkin untuk ini? Catatan: Saya menggunakan @AspectJ style Spring AOP.
java
aop
aspectj
spring-aop
Rejeev Divakaran
sumber
sumber
Jawaban:
Anda harus menggabungkan jenis titik potong dengan titik potong metode.
Titik-titik ini akan melakukan pekerjaan untuk menemukan semua metode publik di dalam kelas yang ditandai dengan penjelasan @Monitor:
Nasihat pointcut terakhir yang menggabungkan dua yang pertama dan Anda selesai!
Jika Anda tertarik, saya telah menulis lembar contekan dengan gaya @AspectJ di sini dengan contoh dokumen yang sesuai di sini.
sumber
Menggunakan anotasi, seperti dijelaskan dalam pertanyaan.
Anotasi:
@Monitor
Anotasi pada kelas,
app/PagesController.java
:Penjelasan metode,
app/PagesController.java
:Kustom penjelasan,
app/Monitor.java
:Aspek untuk penjelasan,
app/MonitorAspect.java
:Aktifkan AspectJ,
servlet-context.xml
:Sertakan AspectJ perpustakaan,
pom.xml
:sumber
Monitor
harus menjadi Musim SemiComponent
?Component
penjelasan digunakan untuk memberitahu wadah musim semi untuk menerapkan menyertakan kelas di AspectJ penenun hal. Secara default, musim semi hanya melihatController
,Service
dan penjelasan spesifik lainnya, tapi tidakAspect
.@Component
anotasi pada@interface
bukanAspect
. Mengapa itu dibutuhkan?@Component
penjelasan membuatnya begitu Spring akan compile dengan sistem berorientasi aspek AspectJ IOC / DI. Saya tidak tahu bagaimana mengatakannya secara berbeda. docs.spring.io/spring/docs/3.2.x/spring-framework-reference/…Sesuatu seperti itu:
Perhatikan bahwa Anda tidak boleh memiliki saran lain di kelas yang sama sebelum ini, karena anotasi akan hilang setelah proksi.
sumber
Menggunakan
sumber
seharusnya cukup untuk menandai metode aspek Anda seperti ini:
lihat ini untuk panduan langkah demi langkah tentang ini.
sumber
Anda juga dapat mendefinisikan titik potong sebagai
sumber
execution(public * @Monitor *.*(..))
Bekerja sedikit lebih sederhana juga.Cara paling sederhana adalah:
Ini akan mencegat eksekusi semua metode khusus yang dijelaskan dengan '@MyHandling' di kelas 'YourService'. Untuk mencegat semua metode tanpa kecuali, cukup letakkan anotasi langsung di kelas.
Tidak masalah ruang lingkup privat / publik di sini, tetapi perlu diingat bahwa spring-aop tidak dapat menggunakan aspek untuk pemanggilan metode dalam contoh yang sama (biasanya yang privat), karena tidak menggunakan kelas proxy dalam kasus ini.
Kami menggunakan saran @Around di sini, tetapi pada dasarnya sintaksisnya sama dengan @Sebelum, @Setelah saran apa pun.
Omong-omong, anotasi @MyHandling harus dikonfigurasi seperti ini:
sumber
// perform actions after
akan pernah dipanggil karena kami mengembalikan nilai di baris sebelumnya.Anda bisa menggunakan Spring's PerformanceMonitoringInterceptor dan secara program mendaftarkan saran menggunakan prosesor beanpost.
sumber
Dari Spring's
AnnotationTransactionAspect
:sumber