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?
java
spring
design-patterns
aspectj
spring-aop
babydudecoder
sumber
sumber
Jawaban:
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
AspectJ Pros
AspectJ Cons
sumber
If you need to advise objects not managed by the Spring container (such as domain objects typically), then you will need to use AspectJ.
Terlepas dari apa yang orang lain telah menyatakan - hanya untuk ulang kata-kata,
there are two major differences
:Spring-AOP: Tenun Runtime melalui proxy menggunakan konsep
dynamic 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 - perluaspectj
file 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.
sumber
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 .
sumber
Panduan pengguna musim semi akan memberikan banyak informasi, langsung dari mulut kuda.
Bab 6.4 - Memilih gaya deklarasi AOP mana yang akan digunakan sudah mati untuk Anda karena membahas pro dan kontra dari keduanya.
Paragraf 6.1.2 - Pegas AOP Kemampuan dan sasaran & bab 6.2 - Dukungan @Aspect dan 6.8 - Menggunakan AspectJ dengan aplikasi Pegas harus secara khusus menarik.
sumber
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:
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,
@EnabledLoadWeaving
atau dalam XML. Anda dapat menggunakan ruang nama sebagai contoh. Namun di Spring AOP Anda tidak dapat mencegat semua kasus. Misalnya,new
perintah tidak didukung di Spring AOP.Namun di Spring AOP Anda bisa mendapatkan manfaat dari penggunaan AspectJ melalui penggunaan
aspectof
metode 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
sumber
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.
sumber
Artikel ini juga memiliki penjelasan yang bagus mengenai topik tersebut.
sumber
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.
sumber