Spring AOP vs AspectJ

178

Saya mendapat kesan bahwa Spring AOP paling baik digunakan untuk tugas-tugas spesifik aplikasi seperti keamanan, pencatatan, transaksi, dll. Karena menggunakan anotasi Java5 khusus sebagai kerangka kerja. Namun, AspectJ tampaknya lebih ramah-pola desain.

Adakah yang bisa menyoroti berbagai pro dan kontra dari menggunakan Spring AOP vs AspectJ dalam aplikasi Spring?

babydudecoder
sumber
3
Ketika beberapa anotasi ada di Spring tetapi juga ada di Java apa yang harus Anda gunakan? Jawa. Logika yang sama berlaku untuk fungsi ini. Spring adalah Spring. di sini hari ini hilang besok. (Ingat orang menggunakan Struts beberapa saat sebelum Musim Semi). AspectJ adalah solusi jangka panjang yang disukai. Ini akan bertahan lebih lama dari Spring. Saya tidak menolak Spring, hanya mengatakan, untuk aspek ini ...: -;
inor

Jawaban:

236

Spring-AOP Pro

  • Lebih mudah digunakan daripada AspectJ, karena Anda tidak harus menggunakan LTW ( load-time weaving ) atau kompiler AspectJ.

  • Ini menggunakan pola Proxy dan pola Dekorator

Spring-AOP Cons

  • Ini adalah AOP berbasis proxy, jadi pada dasarnya Anda hanya dapat menggunakan titik-titik eksekusi eksekusi metode.
  • Aspek tidak diterapkan saat memanggil metode lain dalam kelas yang sama.
  • Mungkin ada overhead runtime kecil.
  • Spring-AOP tidak dapat menambahkan aspek apa pun yang tidak dibuat oleh pabrik Spring

AspectJ Pros

  • Ini mendukung semua titik bergabung. Ini artinya Anda bisa melakukan apa saja.
  • Ada overhead runtime yang lebih sedikit daripada Spring AOP.

AspectJ Cons

  • Hati-hati. Periksa apakah aspek Anda dianyam hanya untuk apa yang Anda inginkan.
  • Anda memerlukan proses build tambahan dengan AspectJ Compiler atau harus mengatur LTW (load-time weaving)
Whiteship
sumber
20
@Configurable membutuhkan penggunaan AspecJ via Spring. Dari dokumen:If you need to advise objects not managed by the Spring container (such as domain objects typically), then you will need to use AspectJ.
HDave
7
pegas-aop con lain bagi saya adalah stacktrace panjang yang tidak dapat dibaca karena pendekatan berbasis proxy
wrm
1
Bagian yang membingungkan dalam jawaban: bagaimana memiliki overhead runtime kecil pro untuk satu alat dan kemungkinan memiliki overhead runtime kecil con untuk yang lain?
Moreaki
16
@Moreaki: Dia mengatakan 'sedikit overhead' sebagai penipu, dan 'sedikit overhead' sebagai pro. Perbedaan 'a' sangat penting - dalam bahasa Inggris, 'sedikit' berarti 'sebagian', sedangkan 'sedikit' berarti 'hampir tidak ada'.
wujek
1
Hanya keraguan cepat - dalam Pro AOP Spring Anda (poin ke-2) - jika kita menggunakan @Aktifkan anotasi di spring, itu akan menjadi aspekJ AOP, hanya ingin tahu, dalam hal ini apakah akan menggunakan Proxy (Run time) atau modifikasi byte (kompilasi) waktu). Karena, saya mendapat kesan bahwa AspectJ adalah waktu kompilasi dan Spring AOP dijalankan waktu AOP. Tolong bantu
Pedantic
21

Terlepas dari apa yang orang lain telah menyatakan - hanya untuk ulang kata-kata, there are two major differences:

  1. Salah satunya terkait dengan jenis tenun.
  2. Lain dengan definisi joinpoint.

Spring-AOP: Tenun Runtime melalui proxy menggunakan konsepdynamic proxy if interface exists or cglib library if direct implementation provided.

AspectJ: Mengkompilasi waktu melalui AspectJ Java Tools(ajc compiler)jika sumber tersedia atau memposting tenun kompilasi (menggunakan file yang dikompilasi). Juga, memuat waktu menenun dengan Spring dapat diaktifkan - perlu aspectjfile definisi dan menawarkan fleksibilitas.

Kompilasi waktu tenun dapat menawarkan manfaat kinerja (dalam beberapa kasus) dan juga joinpoint definition in Spring-aop is restricted to method definition only which is not the case for AspectJ.

techzen
sumber
20

Catatan tambahan: Jika kinerja di bawah beban tinggi adalah penting, Anda akan menginginkan AspectJ yang 9-35x lebih cepat dari Spring AOP . 10ns vs 355ns mungkin tidak terlalu banyak terdengar, tetapi saya telah melihat orang menggunakan LOTS of Aspects. Nilai aspek 10K. Dalam kasus ini, permintaan Anda mungkin mencapai ribuan aspek. Dalam hal ini Anda menambahkan ms ke permintaan itu.

Lihat tolok ukurnya .

Joseph Lust
sumber
14

Spring AOP adalah salah satu bagian penting dari framework spring. Pada tahap yang sangat mendasar, kerangka pegas didasarkan pada IoC dan AOP. Dalam kursus resmi Spring ada slide di mana ia mengatakan:

AOP adalah salah satu bagian terpenting dari kerangka kerja.

Poin kunci untuk memahami cara kerja AOP di Spring adalah bahwa ketika Anda menulis sebuah Aspect with Spring, kami instrumen kerangka kerja dengan membangun proxy untuk objek Anda, dengan JDKDynamicProxy jika kacang Anda mengimplementasikan antarmuka atau melalui CGLIB jika kacang Anda tidak mengimplementasikan apa pun antarmuka. Ingatlah bahwa Anda harus memiliki cglib 2.2 di jalur kelas Anda jika Anda menggunakan Spring sebelum versi 3.2. Mulai dari Spring 3.2 tidak ada gunanya karena cglib 2.2 termasuk dalam inti.

Kerangka kerja pada pembuatan kacang akan membuat proksi yang membungkus objek Anda dan menambahkan tanggung jawab lintas sektoral seperti keamanan, manajemen transaksi, pencatatan dan sebagainya.

Penciptaan proksi dengan cara ini akan diterapkan mulai untuk ekspresi pointcut yang instrumen kerangka untuk memutuskan kacang dan metode apa yang akan dibuat sebagai proxy. Nasihat akan lebih bertanggung jawab daripada kode Anda. Ingat bahwa dalam proses ini, titik potong hanya menangkap metode publik yang tidak dinyatakan sebagai final.

Sekarang, ketika di Spring AOP, penenunan Aspek akan dilakukan oleh wadah pada awal wadah, di AspectJ Anda harus melakukan ini dengan kompilasi pos kode Anda melalui modifikasi bytecode. Untuk alasan ini, menurut saya pendekatan Spring lebih sederhana dan lebih mudah dikelola daripada AspectJ.

Di sisi lain, dengan Spring AOP Anda tidak dapat menggunakan semua kekuatan AOP karena implementasi dilakukan melalui proxy dan bukan dengan melalui modifikasi kode Anda.

Seperti di AspectJ, Anda dapat menggunakan tenun waktu muat di SpringAOP. Anda dapat memanfaatkan fitur ini pada musim semi yang diimplementasikan dengan agen dan konfigurasi khusus, @EnabledLoadWeavingatau dalam XML. Anda dapat menggunakan ruang nama sebagai contoh. Namun di Spring AOP Anda tidak dapat mencegat semua kasus. Misalnya, newperintah tidak didukung di Spring AOP.

Namun di Spring AOP Anda bisa mendapatkan manfaat dari penggunaan AspectJ melalui penggunaan aspectofmetode pabrik di kacang konfigurasi pegas.

Karena Spring AOP pada dasarnya adalah proxy yang dibuat dari wadah, jadi Anda dapat menggunakan AOP hanya untuk kacang musim semi. Sementara dengan AspectJ Anda dapat menggunakan aspek di semua kacang Anda. Titik perbandingan lainnya adalah debug dan prediktabilitas perilaku kode. Dengan spring AOP, pekerjaan sudah dilakukan sebelumnya dari kompiler Java dan aspek adalah cara yang sangat keren untuk membuat proxy untuk kacang Spring Anda. Di AspectJ jika Anda memodifikasi kode, Anda perlu lebih kompilasi dan untuk memahami di mana aspek Anda ditenun menjadi sulit. Bahkan mematikan tenun di pegas lebih mudah: dengan pegas Anda menghapus aspek dari konfigurasi Anda, restart dan berfungsi. Di AspectJ Anda harus mengkompilasi ulang kode!

Dalam menenun waktu-waktu, AspectJ lebih fleksibel daripada Pegas karena Pegas tidak mendukung semua opsi AspectJ. Tetapi menurut saya Jika Anda ingin mengubah proses pembuatan kacang, cara yang lebih baik adalah mengelola login kustom di pabrik dan tidak dengan menenun waktu dari aspek yang mengubah perilaku operator baru Anda.

Saya berharap bahwa ini panorama AspectJ dan Spring AOP membantu Anda memahami perbedaan dari dua ramuan

Valerio Vaudi
sumber
0

Penting untuk mempertimbangkan apakah aspek Anda akan kritis misi dan di mana kode Anda digunakan. Pegas AOP akan berarti bahwa Anda mengandalkan tenun waktu beban. Ini bisa gagal untuk menenun dan dalam pengalaman saya berarti bahwa kesalahan login mungkin ada tetapi tidak akan mencegah aplikasi berjalan tanpa kode aspek [Saya akan menambahkan peringatan bahwa mungkin untuk mengkonfigurasinya sedemikian rupa sehingga ini bukan kasus; tapi saya pribadi tidak menyadarinya ]. Tenun waktu kompilasi menghindari ini.

Selain itu, Jika Anda menggunakan AspectJ bersamaan dengan aspekj-maven-plugin maka Anda dapat menjalankan tes unit terhadap aspek Anda di lingkungan CI dan memiliki keyakinan bahwa artefak yang dibangun diuji dan ditenun dengan benar. Meskipun Anda tentu saja dapat menulis uji unit yang didorong Spring, Anda masih tidak memiliki jaminan bahwa kode yang digunakan akan menjadi yang diuji jika LTW gagal.

Pertimbangan lain adalah apakah Anda meng-hosting aplikasi di lingkungan di mana Anda dapat secara langsung memantau keberhasilan atau kegagalan startup server / aplikasi atau apakah aplikasi Anda sedang digunakan di lingkungan di mana itu tidak di bawah pengawasan Anda [misalnya di mana itu di-host oleh klien]. Sekali lagi, ini akan menunjukkan cara mengkompilasi tenunan waktu.

Lima tahun yang lalu, saya jauh lebih menyukai Spring yang dikonfigurasi AOP karena alasan sederhana bahwa lebih mudah untuk dikerjakan dan lebih sedikit mengunyah IDE saya. Namun, karena daya komputasi dan memori yang tersedia telah meningkat, ini menjadi masalah yang jauh lebih sedikit dan CTW dengan aspekj-maven-plugin telah menjadi pilihan yang lebih baik di lingkungan kerja saya berdasarkan alasan yang telah saya uraikan di atas.

kcampbell
sumber
0

Artikel ini juga memiliki penjelasan yang bagus mengenai topik tersebut.

Spring AOP dan AspectJ memiliki tujuan yang berbeda.

Spring AOP bertujuan untuk menyediakan implementasi AOP sederhana di Spring IoC untuk memecahkan masalah paling umum yang dihadapi oleh para programmer.

Di sisi lain, AspectJ adalah teknologi AOP asli yang bertujuan untuk memberikan solusi AOP lengkap.

gce
sumber
0

Dibandingkan dengan AOP, AspectJ tidak perlu meningkatkan kelas target pada waktu kompilasi. Sebagai gantinya, ia menghasilkan kelas proxy untuk kelas target saat runtime, yang mengimplementasikan antarmuka yang sama dengan kelas target atau merupakan subkelas dari kelas target.

Singkatnya, turunan dari kelas proxy dapat digunakan sebagai turunan dari kelas target. Secara umum, kerangka kerja AOP yang ditingkatkan saat kompilasi lebih menguntungkan dalam kinerja — karena kerangka kerja AOP yang ditingkatkan saat runtime membutuhkan perangkat tambahan dinamis setiap kali dijalankan.

Jerry Hsu
sumber