Perkenalan
Oriented Oriented Programming (AOP) memberikan perspektif lain untuk berpikir tentang struktur program, yang menebus kekurangan pemrograman berorientasi objek (OOP). Selain kelas, AOP menyediakan segi. Modularisasi fokus, seperti manajemen transaksi silang dari berbagai jenis dan objek. (Ketentuan kepedulian ini sering disebut sebagai masalah pemotongan silang.)
Komponen kunci musim semi adalah kerangka kerja AOP. Meskipun demikian, wadah Spring IOC tidak bergantung pada AOP, yang berarti Anda bebas memilih apakah akan menggunakan AOP. AOP menyediakan solusi middleware yang kuat, yang membuat wadah Spring IOC lebih lengkap.
Spring 2.0 AOP:
Spring 2.0 memperkenalkan cara yang lebih sederhana dan lebih kuat untuk menyesuaikan bagian, dan pengguna dapat memilih untuk menggunakan metode berbasis skema atau menggunakan anotasi @AspectJ. Untuk aplikasi baru, jika pengguna sedang berkembang di Java 5, kami merekomendasikan agar pengguna menggunakan gaya @AspectJ, jika tidak gaya berbasis pola dapat digunakan. Kedua gaya sepenuhnya mendukung jenis saran dan bahasa aspek yang dipotong, meskipun masih menenun menggunakan AOP Spring.
Bab ini terutama membahas dukungan Spring 2.0 untuk AOP berbasis pola dan @aspek. Spring 2.0 benar -benar mempertahankan kompatibilitas mundur dari pegas 1.2. Bab berikutnya akan membahas dukungan AOP yang mendasari yang disediakan oleh Spring 1.2 API.
AOP digunakan di musim semi:
Layanan Perusahaan Deklaratif disediakan, terutama di tempat layanan deklaratif EJB. Layanan yang paling penting adalah manajemen transaksi deklaratif, yang dibangun di atas abstraksi transaksi abstrak musim semi.
Memungkinkan pengguna untuk mengimplementasikan bagian khusus dan menggunakan AOP untuk meningkatkan penggunaan OOP.
Contoh
Kami sering menggunakan jenis berikut
1. AOP Berdasarkan Agen
2. Sisi objek java murni dan sederhana
3. Formulir anotasi @Adung
4. Mari kita oleskan bagian ASPCET dalam injeksi satu per satu.
Mari kita tulis beberapa kelas dasar terlebih dahulu.
Kelas Antarmuka:
/ *** Tentukan antarmuka*/ antarmuka publik Sleepable {/ *** Metode tidur*/ void sleep (); } Kelas Implementasi:
/ *** Saya mengimplementasikan antarmuka tidur*/ kelas publik Chenllina mengimplementasikan tidur {@override public void sleep () {// Todo Metode Stub System.out.println ("Be Good, saatnya untuk pergi tidur!"); }} Kelas Peningkatan:
/** * Define a sleep enhancement to achieve both pre- and post-set*/ public class SleepHelper implements MethodBeforeAdvice, AfterReturningAdvice { @Override public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable { System.out.println("Apply a facial mask before going to bed"); } @Override public void Sebelumnya (metode metode, objek [] args, target objek) melempar lempar {system.out.println ("Dream After Sleeping"); }}1. AOP berbasis agen
<!-Buat saran yang disempurnakan-> <bean id = "sleephelper"/> <bean id = "lina"/> <!-mendefinisikan titik pencocokan poin semua metode tidur-> <bean id = "sleeppointcut"> <properti nama = "value" value = "Sleep"> </properti </bean> <! id="sleepHelperAdvisor"> <property name="advice" ref="sleepHelper"/> <property name="pointcut" ref="sleepPointcut"/> </bean> <!-- Define a proxy object --> <bean id="linaProxy"> <property name="target" ref="lina"/> <property name="interceptorNames" value="sleepHelperAdvisor"/> <!-<name properti = "proxyInterfaces" value = "com.tgb.springaop.service.sleepable"/>-> </ bean>
Seperti pada file konfigurasi:
Atribut pola menentukan ekspresi reguler. Itu cocok dengan semua metode tidur. Gunakan org.springframework.aop.support.defaultpointcutadvisor untuk menggabungkan titik tangen dan peningkatan untuk membentuk garis singgung lengkap. Setelah konfigurasi akhir selesai, objek proxy akhir dihasilkan melalui org.springframework.aop.framework.proxyfactorybean.
2. Sisi objek java murni dan sederhana
Bagaimana cara mengatakan aspek objek Java yang murni sederhana? Menurut pendapat saya, ini relatif terhadap konfigurasi pertama, yang tidak memerlukan penggunaan proxy, tetapi secara otomatis memindai melalui mekanisme internal pegas. Saat ini, file konfigurasi kami harus dimodifikasi sebagai berikut:
<!-Buat saran yang ditingkatkan-> <bean id = "sleephelper"/> <!-target kelas-> <bean id = "lina"/> <!-Konfigurasikan point-cut dan pemberitahuan-> <bean id = "sleepAdvisor"> <value prox = "ref =" sleephelper "> </properti> <Properti name =" Pola =! -> <bean/>
Apakah jauh lebih sederhana dari yang pertama? Tidak perlu mengkonfigurasi proxy lagi?
3. Formulir anotasi @Adung
Berdasarkan pengalaman kami, kami juga tahu bahwa bentuk anotasi lebih sederhana daripada file konfigurasi. Saat ini, Anda perlu mengomentari metode atau kelas yang ada:
/ ***Tambahkan peningkatan melalui anotasi*/ @Aspect @Component kelas publik sleephelper03 {/* @pointcut ("eksekusi (*com.tgb.springaop.service.impl ..*(..)")*/ @pointcut ("Eksekusi (**.sleep (..)") public void ("public @(*. public void beforesleep () {System.out.println ("Apply Facial Mask Before Sleep"); } @Afterreturning ("sleeppoint ()") public void aftersleep () {System.out.println ("Dream After Sleeping"); }
Cukup tulis di file konfigurasi:
<!-Paket pemindaian-> <konteks: komponen-scan-package = "com.tgb" annotation-config = "true"/> <!-aspekj annotation-> <aop: aspekj-autoproxy proxy-target-class = "true"/> <!-target kelas-> <bean id = "lina"/>
4. Permukaan pemotongan ASPCET dalam bentuk injeksi
Saya pribadi merasa bahwa ini adalah yang paling sederhana, paling umum digunakan, dan paling fleksibel. File konfigurasi adalah sebagai berikut:
<!-Target Class-> <bean id = "lina"/> <bean id = "sleephelper"/> <aop: config> <aop: aspek ref = "sleephelper"> <aop: sebelum metode = "beforesleep" pointcut = "afters" ( *. </aop: aspek> </aop: config>
Kelas sleephelper02 yang disebutkan dalam file konfigurasi adalah sebagai berikut:
/ *** Tambahkan peningkatan melalui anotasi*/ kelas publik sleephelper02 {public void beforesleep () {System.out.println ("Terapkan masker wajah sebelum tidur"); } public void aftersleep () {System.out.println ("Dream After Sleeping"); }}
Apakah itu terlihat sangat sederhana? Apakah Anda semua menggunakan Spring AOP? Lai
Mengenai cara menelepon, saya menulis beberapa kelas tes di sini. Anda bisa melihatnya. Mereka pada dasarnya sama:
/ *** File konfigurasi spring_aop.xml via proxy*/ @test public void test () {ApplicationContext ct = new ClassPathXMLapPlicationContext ("spring_aop.xml"); Sleepable sleeper = (sleepable) ct.getBean ("linaproxy"); sleeper.sleep (); } / *** File konfigurasi spring_aop_01.xml Jawaban pendek JAVA Objek* / @test public void test01 () {ApplicationContext ct = new ClassPathxMlappLicationContext ("Spring_AOP_01.XML"); Sleepable sleeper = (sleepable) ct.getBean ("lina"); sleeper.sleep (); } / *** File konfigurasi spring_aop_03.xml dijelaskan oleh aspek* / @test public void test03 () {applicationContext ct = new ClassPathXMLapPlicationContext ("Spring_AOP_03.XML"); Sleepable sleeper = (sleepable) ct.getBean ("lina"); sleeper.sleep (); } /** * Configuration file spring_aop_02.xml configuration file through apsect* @author Chen Lina* @version May 31, 2015 at 10:09:37 am */ @Test public void test02(){ ApplicationContext ct = new ClassPathXmlApplicationContext("spring_aop_02.xml"); Sleepable sleeper = (sleepable) ct.getBean ("lina"); sleeper.sleep (); }
Dari kelas uji, kita dapat melihat bahwa apa pun cara kita menerapkan AOP, penggunaannya tidak berbeda. Hasil kelas tes ini sama: