Ringkasan
Modul Spirng-AOP adalah modul inti dalam kerangka musim semi. Meskipun wadah IOC pegas tidak bergantung pada AOP, AOP memberikan solusi yang kuat dan fleksibel untuk implementasi IOC.
Dalam kerangka musim semi, AOP terutama digunakan untuk dua tujuan:
Dari perspektif fungsional, AOP dapat dianggap sebagai pelengkap metode pemrograman OOP, menyediakan cara yang berbeda dari kode atau organisasi sistem. Konsep inti dalam OOP adalah kelas, dan di AOP adalah aspek.
Modul Spirng-AOP adalah modul inti dalam kerangka musim semi. Meskipun wadah IOC pegas tidak bergantung pada AOP, AOP memberikan solusi yang kuat dan fleksibel untuk implementasi IOC.
Dalam kerangka musim semi, AOP terutama digunakan untuk dua tujuan:
Spring AOP diimplementasikan dalam Java murni, dan tidak memerlukan pemrosesan kompilasi khusus dan tidak memerlukan kontrol hierarki loader kelas, sehingga dapat digunakan untuk wadah servlet dan server aplikasi lainnya.
Spring AOP saat ini hanya mendukung pengalihan atau intersepsi tingkat metode, dan intersepsi atribut tidak didukung sekarang. Jika Anda ingin mencegat atribut, Anda dapat mempertimbangkan menggunakan bahasa AspectJ.
Spring AOP digunakan secara berbeda dari kebanyakan kerangka AOP lainnya. Tujuan utamanya bukan untuk memberikan serangkaian implementasi AOP yang besar dan komprehensif, tetapi untuk mengintegrasikan berbagai implementasi AOP dan berkolaborasi dengan Spring IOC untuk membantu menyelesaikan beberapa masalah umum.
Perlu dicatat bahwa beberapa disarankan berbutir halus (seperti model domain), Spring AOP sering tidak memberikan dukungan yang baik, dan skenario ini masih mempertimbangkan aspek. Meski begitu, dalam pengalaman umum, mekanisme kuat Spring AOP masih dapat menyelesaikan masalah di sebagian besar skenario.
Jadi bagaimana kita harus melihat Spring AOP dan AspectJ, mengutip teks asli dokumen resmi Spring:
Spring AOP tidak akan pernah berjuang untuk bersaing dengan AspectJ untuk memberikan solusi AOP yang komprehensif. Kami percaya bahwa kedua kerangka kerja berbasis proxy seperti Spring AOP dan kerangka kerja penuh seperti AspectJ sangat berharga, dan bahwa mereka lengkap, bukan dalam kompetisi. Spring dengan mulus mengintegrasikan AOP Spring dan IOC dengan AspectJ, untuk memungkinkan semua penggunaan AOP untuk dilayani dalam arsitektur aplikasi berbasis musim semi yang konsisten. Integrasi ini tidak mempengaruhi API AOP pegas atau API Aliansi AOP: pegas AOP tetap kompatibel ke belakang.
Dalam semua desain modul kerangka musim semi, salah satu prinsip inti yang selalu dipatuhi adalah non-invasif.
Oleh karena itu, saat menggunakan Spring AOP, kami tidak akan memaksa kami untuk memperkenalkan kelas atau antarmuka tertentu ke dalam kode bisnis, yang dapat menjaga kode tetap bersih dan memisahkan tingkat maksimum. Namun, Spring juga menyediakan opsi lain, jika ada skenario tertentu, Anda dapat langsung memperkenalkan AOP Spring dalam kode Anda. Hampir semua modul dalam kerangka musim semi akan memberi Anda berbagai pilihan dalam cara mereka digunakan sehingga pengguna dapat memilih cara yang lebih cocok untuk skenario mereka. Gunakan aspekj atau pegas AOP, gunakan anotasi atau metode konfigurasi XML, tergantung pada U.
Setelah memahami niat asli dan skenario penggunaan Spring AOP, mari kita lihat prinsip implementasinya
Sebagian besar masalah di dunia perangkat lunak dapat diselesaikan dengan menambahkan lapisan.
Lapisan yang disebutkan di sini tentu saja dalam arti luas, yang dapat berupa abstraksi atau cache, yang kira -kira berarti kategori isolasi dan decoupling.
Di dunia musim semi, pengenalan setiap modul, atau integrasi teknologi pihak ketiga, akan selalu memberikan lapisan abstraksi, memberikan API terpadu untuk pengguna, memblokir semua detail implementasi dan perbedaan antara berbagai implementasi. Misalnya, modul-modul seperti cache pegas, spring-jdbc, spring-jms dan spirng-messaging semuanya menyediakan lapisan abstraksi.
Spring AOP Implementasi adalah mekanisme berbasis proxy, yang menggunakan proxy dinamis JDK secara default, dan juga dapat menggunakan proxy CGLIB. Perbedaan antara keduanya terutama perbedaan antara objek yang diproksi. Ketika objek target adalah antarmuka, proxy dinamis JDK dapat menyelesaikan proxy, tetapi ketika objek target tidak mengimplementasikan kelas antarmuka (cobalah untuk menjadi lebih sedikit, pemrograman berorientasi antarmuka adalah kebiasaan yang baik), perlu menggunakan proxy cGlib untuk menyelesaikan proxy. Tentu saja, Anda juga dapat memaksa antarmuka untuk menggunakan CGLIB sebagai proxy; Selain itu, ketika jenis tertentu perlu disuntikkan atau direferensikan, jika objek yang direferensikan adalah objek proxy, Anda juga perlu menggunakan metode CGLIB.
Desain dan implementasi fungsional dapat dibagi menjadi dua bagian utama
Penciptaan AOP
Kelas inti yang menghasilkan objek proxy, proxyfactorybean getObject ()
Gambar berikut adalah logika seleksi apakah akan menggunakan JDK atau CGLIB saat menghasilkan proxy:
Setelah menemukan pelaksana spesifik agen generasi, kapan operasi ini dipanggil? Mereka yang telah memahami siklus hidup biji musim semi harus tahu bahwa ketika kacang dibuat, ada serangkaian antarmuka callback bagi pengguna untuk memasukkan perilaku khusus untuk mempengaruhi beberapa karakteristik kacang. Beanpostprocessor adalah salah satu antarmuka. Artikel sebelumnya telah diperkenalkan (senjata pamungkas untuk dimainkan dengan kacang musim semi). Spring AOP memanfaatkan kesempatan ini untuk memasukkan trik dalam proses menciptakan kacang. Jika kacang yang dibuat adalah target AOP kami, buat proxy dan akhirnya mengembalikan objek proxy ke IOC.
AbstractAutoproxycreator Kelas ini adalah implementasi beanpostprocessor, digunakan untuk membuat proxy, lihat metode pasca pemrosesan prosesor ini, dan akhirnya mengembalikan proxy yang dikembalikan dengan metode createProxy ().
Peningkatan eksekusi bagian AOP
Itu dapat dipahami sebagai panggilan untuk semua rantai pencegat pada objek target
Karena ada dua implementasi spesifik Spring AOP, JDK Dynamic Proxy dan CGLIB, metode pelaksanaan pencegat berbeda. Untuk detailnya, Anda dapat membaca kode sumber metode Invoke JDKDYNAMICAOPPROXY
Panggilan ke metode target pada akhirnya bergantung pada reflectiveMethodinVocation.
Proses pemrosesan dalam ReflectiveMethodinVocation menggunakan metode rekursif untuk memproses rantai interseptor.
Metode intersep CGLIBAOPPROXY
CGlibMethodinVocation mewarisi reflectiveMethodinVocation, dan metode proses () di atas digunakan untuk menangani rantai interseptor.
Dua detail yang perlu diperhatikan saat menggunakan AOP Spring:
1. Spring AOP tidak berfungsi saat memanggil metode di dalam kelas (self-invoke), karena panggilan internal tidak melewati objek proxy dan secara langsung digunakan. Solusi adalah:
2. Saat menyuntikkan kacang, jika Anda ingin menyuntikkan jenis kacang tertentu alih -alih antarmuka, maka gunakan cGlib
Spring AOP memiliki fungsi yang kuat dan desain yang cerdas. Konteks utama disortir di sini, dan detailnya tidak akan dibahas satu per satu.
Meringkaskan
Di atas adalah seluruh konten artikel ini. Saya berharap konten artikel ini memiliki nilai referensi tertentu untuk studi atau pekerjaan semua orang. Jika Anda memiliki pertanyaan, Anda dapat meninggalkan pesan untuk berkomunikasi. Terima kasih atas dukungan Anda ke wulin.com.