0. Tentang AOP
Aspek Berorientasi Pemrograman (AOP) adalah topik hangat dalam pengembangan perangkat lunak dan bagian penting dari kerangka kerja Spring. Berbagai bagian logika bisnis dapat diisolasi dengan menggunakan AOP, sehingga mengurangi kopling antara berbagai bagian logika bisnis, meningkatkan penggunaan kembali program, dan meningkatkan efisiensi pengembangan.
AOP adalah kelanjutan dari OOP.
Fungsi utamanya adalah: logging, statistik kinerja, kontrol keamanan, pemrosesan transaksi, penanganan pengecualian, dll.
Tujuan utama adalah untuk membagi kode seperti logging, statistik kinerja, kontrol keamanan, pemrosesan transaksi, penanganan pengecualian, dll. Dari kode logika bisnis. Dengan memisahkan perilaku ini, kami berharap dapat memisahkannya menjadi metode logika bisnis non-panduan, dan kemudian mengubah perilaku ini tanpa mempengaruhi kode logika bisnis.
Teknologi yang secara dinamis menambahkan fungsi ke program tanpa memodifikasi kode sumber dapat dicapai melalui metode pra -kompilasi dan proksi dinamis selama runtime. AOP sebenarnya merupakan kelanjutan dari model desain GOF. Model desain mengejar decoupling antara penelepon dan callee, meningkatkan fleksibilitas dan skalabilitas kode. AOP dapat dikatakan sebagai implementasi dari tujuan ini.
Memberikan dukungan yang kaya untuk pemrograman berorientasi aspek di musim semi, memungkinkan pengembangan kohesif dengan memisahkan logika bisnis aplikasi dari layanan tingkat sistem seperti audit dan manajemen transaksi. Objek aplikasi hanya mengimplementasikan apa yang harus mereka lakukan - Lengkapi Logika Bisnis - Itu saja. Mereka tidak bertanggung jawab (atau bahkan menyadari) masalah tingkat sistem lainnya, seperti dukungan logging atau transaksi.
1. Memuat file konfigurasi eksternal lainnya atau file properti di Spring melalui PropertainLopHolderConfigurer:
Dalam banyak proyek Javaee, peran musim semi sangat penting. Ini adalah wadah ringan yang mengelola modul dan komponen lain. Spring sering perlu mengelola struts, ibatis, hibernate, dll. File konfigurasi kerangka kerja open source ini dimuat pada musim semi hingga Spring's PropertyplaceFolderConfigurer untuk manajemen. Selain itu, informasi koneksi database, file properti informasi koneksi JNDI, dll. Penggunaannya adalah sebagai berikut:
(1). Muat file lain ke pegas melalui propertiPlaceHolderConfigurer:
Tambahkan konfigurasi berikut dalam file konfigurasi pegas:
<bean class = "org.springframework.beans.factory.config.propertyplaceHolderConfigurer"> <properti nama = "Lokasi"> <value> classpath: nama file untuk memuat </ value> ... </prop Propert> </bean>
(2). File konfigurasi atau atribut yang akan dimuat melalui konfigurasi di (1) dimuat ke dalam pegas. Jika Anda juga perlu menggunakan beberapa informasi tentang konfigurasi yang dimuat atau file data saat runtime, seperti menggunakan informasi koneksi basis data atau informasi koneksi JNDI, Anda dapat menggunakan sintaks dari tipe Ex Expressions untuk referensi, misalnya:
<bean id = "DataSource" Destroy-Method = "Close" class = "org.apache.common.dbcp.basicDataSource"> <!-Misalkan informasi koneksi database ditulis dalam file properti eksternal dan telah dimuat oleh spring-> <nama properti = "driverclassname" value = "$ {diver}" " value = ”$ {url}”/> <properti name = ”userName” value = ”$ {username}”/> <properti name = ”password” value = ”$ {password}”/> </ bean>
Catatan: Anda juga dapat menggunakan <konteks: properti-placeHolderLocation = "classpath: nama file untuk memuat"/>
2. Dinamis Proxy untuk Java:
Prinsip implementasi yang mendasari Spring adalah proxy dinamis, jadi Anda harus terlebih dahulu memahami proxy dinamis sebelum mempelajari pemrograman yang berorientasi pada aspek.
Proksi dinamis banyak digunakan dalam Java, dan proxy dinamis adalah salah satu pola desain klasik yang sangat umum digunakan dalam pola desain pada 23. Prinsip proxy dinamis adalah bahwa ketika objek target atau metodenya akan dipanggil, sistem tidak secara langsung mengembalikan objek target, tetapi mengembalikan objek proxy, dan mengakses objek target atau metode target dari target tersebut dengan langsung mengembalikan objek target, tetapi mengembalikan objek proxy.
Prinsip sederhana proxy dinamis adalah sebagai berikut:
Penelepon Klien -> Objek Proxy -> Disebut Objek Target.
Ketika klien memanggil objek proxy, objek proxy mendelegasikan objek target untuk memanggil metode bisnisnya.
Proksi dinamis dibagi menjadi dua jenis: proxy dinamis untuk antarmuka dan proxy dinamis untuk kelas biasa. Proxy dinamis di Java adalah proxy dinamis untuk antarmuka nyata. CGLIB adalah proxy dinamis untuk kelas biasa. Paket Dependensi Javaee Target dan Paket Jar Spring sudah berisi paket JAR yang berhubungan dengan CGLIB, sehingga Anda dapat secara dinamis memberikan proxy kelas proxy atau biasa.
(1) Proxy dinamis .java untuk antarmuka:
Proksi dinamis di Java hanya dapat disahkan secara dinamis untuk antarmuka. Oleh karena itu, objek target harus mengimplementasikan antarmuka, dan objek proxy harus mengimplementasikan semua antarmuka objek target. Alur kerja adalah sebagai berikut:
A. Menulis kelas proxy dinamis:
CATATAN: Proxy dinamis harus mengimplementasikan antarmuka InvocationHandler, dan mengimplementasikan metode berikut:
Salinan kode adalah sebagai berikut:
Invoke objek (instance proxy objek, contoh metode metode antarmuka yang disebut pada metode proxy metode, objek [] array objek nilai parameter yang diteruskan ke instance proxy);
Dokumentasi untuk menginstal JDK dijelaskan. Metode ini digunakan untuk lulus instance proxy, mengidentifikasi objek java.lang.reflect.method yang menyebut metode ini, dan array tipe objek yang berisi parameter. Penangan panggilan menangani panggilan metode yang dikodekan dengan cara yang tepat, dan hasilnya akan dikembalikan sebagai hasil dari panggilan metode pada instance proxy.
B. Buat objek proxy:
Proxy.newproxyInstance (class loader, class <?> [] Array antarmuka, objek proxy callback (biasanya ini))
Ketika metode objek target dipanggil, objek proxy dari objek target dibuat melalui metode. Objek proxy akan secara otomatis memanggil metode Invoke untuk memanggil objek target dan mengembalikan hasil panggilan.
(2) .cglib adalah proxy dinamis untuk kelas Java biasa:
Ketika CGLIB membuat proxy dinamis, itu tidak memerlukan kelas target untuk mengimplementasikan antarmuka. Alur kerjanya adalah sebagai berikut:
A. Menulis kelas proxy dinamis:
Penambah penambah = penambah baru (); // Atur kelas induk dari kelas target ke penambahnya sendiri. // Atur objek Callback ke objek proxy dinamis itu sendiri Enhancer.setCallback (ini);
B. Menerapkan antarmuka MethodInterceptor:
Menerapkan metode berikut:
Intercept objek (instance proxy objek, contoh metode metode antarmuka yang disebut pada metode proxy metode, objek [] Array objek nilai parameter yang diteruskan ke panggilan metode pada instance proxy, instance proxy metode MethodProxy);
Catatan: CGLIB tidak hanya dapat secara dinamis proxy untuk kelas, tetapi juga proksi secara dinamis untuk metode.
3. Konsep dasar pemrograman berorientasi (AOP):
Ambil metode Java biasa sebagai contoh
Nama Metode Jenis Pengembalian Publik (Daftar Parameter) {-> Metode Notifikasi Surroga Metode Preprocessing Code-> Pra-Notifikasi Coba {Metode Implementasi Khusus (Badan Metode) ... Metode Kode Post-Pemrosesan-> Pasca-Notifikasi} Catch (Tipe Pengecualian E) {Pengecualian Penanganan ...-> Pemberitahuan Pengecualian} Akhirnya {Agen Pemrosesan Terakhir ... ―>
A. Kekhawatiran silang: Misalnya, di 5 lokasi pemberitahuan di atas, dalam objek Java, objek-objek ini dengan logika pemrosesan umum yang sama yang dapat ditambahkan ke logika pemrosesan seperti verifikasi izin, pemrosesan benda, logging, dll. Disebut kekhawatiran silang. Fokus pemrograman berorientasi objek (OOP) adalah untuk secara vertikal abstrak hal-hal di dunia nyata menjadi model objek pemrograman. Fokus pemrograman berorientasi aspek (AOP) adalah horizontal, yang mengabstraksi tempat-tempat yang mirip dengan logika pemrosesan dalam model objek pemrograman untuk membentuk garis singgung, sedangkan logika pemrosesan dalam objek pemrograman adalah fokus tangent horizontal.
B. Aspek: Mengabaikan kekhawatiran silang adalah untuk membentuk bagian, yang mirip dengan kelas. Keduanya memiliki kekhawatiran yang berbeda. Kelas adalah abstraksi dari karakteristik hal, dan bagian adalah abstraksi dari masalah lintas sekelompok.
C. Joinpoint: Titik yang dicegat disebut pada musim semi, karena Spring hanya mendukung titik koneksi tipe metode, yaitu, metode yang dicegat. Metode seperti yang ditunjukkan pada contoh di atas.
D. Pointcut: Mengacu pada definisi mencegat titik koneksi, yang merupakan kumpulan titik koneksi, yaitu, kumpulan serangkaian metode yang dicegat.
e. Saran: Mengacu pada apa yang harus dilakukan setelah mencegat titik koneksi, yaitu pemrosesan logis setelah mencegat. Verifikasi izin yang biasa, pemrosesan benda, penebangan dan operasi lainnya didefinisikan dan diselesaikan dalam pemberitahuan.
F. Target: Objek target proxy, yaitu objek yang dicegat. Seperti pada contoh di atas, objek tempat metode berada.
G. Weave: mengacu pada proses penerapan bagian ke objek target dan menyebabkan pembuatan objek proxy.
H. Pendahuluan: Tanpa memodifikasi kode, pengantar dapat secara dinamis menambahkan beberapa metode dan bidang ke kelas selama runtime.
4. Spring mendukung dependensi yang mendukung pemrograman berorientasi (AOP):
3 paket berikut di direktori setelah musim semi didekompresi:
lib/aspekj/aspectjweaver.jarlib/aspekj/aspectjrt.jarlib/cglib/cglib-nodep-2.1-3.jar
5. Saat menggunakan pemrograman berorientasi aspek (AOP) di musim semi, Anda perlu memperkenalkan namespace AOP dalam file konfigurasi pegas, yaitu, tambahkan konfigurasi berikut:
xmlns: aop = "http://www.springframework.org/schema/aop" "http://www.springframework.org/schema/aop http://www.spramework.org/schema http://www.springframework.org/schema/aop/spring-aop-2.5.xsd "
Catatan: Spring 2.5 menyediakan dua metode AOP, yaitu, berdasarkan file konfigurasi XML dan metode anotasi Java.
Untuk menggunakan metode anotasi AOP, Anda perlu menambahkan metode anotasi objek berikut dukungan AOP di file konfigurasi pegas:
<AOP: AspectJ-autoproxy/>
6. Kelas Kemasan Javabean - Beanwrapper:
Spring merangkum perilaku Javabean melalui kelas Beanwrapper, dan dapat mengatur dan mendapatkan nilai atributnya, seperti:
Objek kelas pembungkus beanwrapper = beanwrapperImpl (kelas baru dibungkus ()); wrapper class object.setPropertyValue ("nama properti", "nilai properti");
Metode ini memungkinkan Anda untuk mengatur properti ke kelas yang dibungkus.
7. Pengembangan Pemrograman Berorientasi Berorientasi (AOP) Berdasarkan Anotasi:
(1). Tambahkan dukungan AOP untuk metode anotasi dalam file konfigurasi pegas.
(2). Tentukan bagian:
Mirip dengan membuat kelas normal, menambahkan anotasi "@Aspect" sebelum kelas menunjukkan bahwa kelas adalah bagian.
(3). Tambahkan titik masuk ke permukaan potong:
Titik pemotongan titik adalah kumpulan metode objek yang dicegat. Biasanya, titik pemotongan titik didefinisikan dalam metode pemrosesan titik pemotongan titik di bagian. Gunakan anotasi "@pointcut", dan sintaksnya adalah sebagai berikut:
@Pointcut ("Eksekusi (*com.test.service ..*.*(..))") public void anyeMhod () {// Metode ini disebut "titik titik" dan "point-cut" pemrosesan}
Penjelasan terperinci dari parameter sintaks:
A. "*" Pertama: berarti bahwa metode yang dicegat adalah tipe pengembalian sewenang -wenang.
B. com.test.service: Ini adalah contoh sederhana, menunjukkan nama paket yang akan dicegat, yaitu, paket yang akan dicegat.
C. Keduanya ".." setelah nama paket yang dicegat: berarti subpacket di bawah paket yang dicegat juga dicegat secara rekursif, yaitu, subpacket yang dicegat.
D. "*" Setelah "..": mewakili semua kelas di bawah paket yang dicegat dan subpaknya, yaitu kelas yang dicegat.
e. "*" Terakhir: mewakili semua metode di kelas yang dicegat, yaitu metode yang dicegat.
F. "(..)": berarti bahwa metode yang dicegat menerima parameter apa pun, yaitu parameter yang dicegat.
Catatan: Sintaks definisi titik dapat mendukung karakter wildcard, tetapi Anda harus secara ketat mengikuti aturan sintaksis. menyukai:
@Pointcut ("Eksekusi (*com.test.service ..*. Tambah*(..))") Ini berarti mencegat metode dimulai dengan "tambahkan" di semua kelas di bawah paket layanan com.test dan subpaknya.
(4). Tambahkan pemberitahuan ke bagian:
Untuk lokasi pemberitahuan di musim semi, silakan merujuk ke contoh -contoh kecil dalam 3.
Anotasi "@Before": Deklarasikan pra-notifikasi.
"@Afterrutruning" Anotasi: Deklarasikan pasca-notifikasi.
Anotasi "@After": Nyatakan pemberitahuan akhir.
Anotasi "@afterthrowing": menyatakan pemberitahuan pengecualian.
Anotasi "@around": menyatakan pemberitahuan di sekitarnya.
Contoh mendefinisikan pemberitahuan adalah sebagai berikut:
@Before ("AnyMethod () (Nama titik masuk yang dinyatakan di celah wajah)") public void doAccessCheck () {...}
Catatan: Pemberitahuan surround sedikit berbeda dari 4 jenis pemberitahuan lainnya. Pemberitahuan surround didefinisikan dengan cara khusus. Pemberitahuan surround akan berfungsi sebelum dan sesudah seluruh metode panggilan, sehingga objek titik koneksi harus digunakan untuk memberi tahu titik koneksi untuk melanjutkan pemrosesan logis setelah pemrosesan pemberitahuan surround. Definisi ini adalah sebagai berikut:
@Around (Cari ke Point Name) Objek Publik DobasicProfiling (ProcedingJoinPoint PJP) melempar lempar {... return pjp.promed (); // kalimat ini memberi tahu titik koneksi untuk terus melakukan operasi lain} 8. Beberapa tips untuk pengembangan pemrograman berorientasi aspek (AOP) berdasarkan anotasi:
(1). Dapatkan Parameter Input:
menyukai:
@Before ("Daftarkan nama dot && args (nama parameter input)") public void dosomething (nama parameter input string) {...}
(2). Dapatkan hasil pengembalian:
menyukai:
@AfterReturning (pointcut = "Masuk Nama Titik", return = "Return Rain Name") public void dosomething (nama Hasil String) {...}
9. Pengembangan pemrograman berorientasi bagian (AOP) berdasarkan XML:
(1). Tentukan kelas facet dan tambahkan pemberitahuan ke kelas faset.
(2). Konfigurasikan kelas facet di file konfigurasi pegas seperti kelas Java biasa.
(3). Tambahkan konfigurasi AOP di file konfigurasi pegas sebagai berikut:
<aop: config> <!-bagian konfigurasi-> <aop: aspek id = "bagian id" ref = "id dari kelas bagian dalam file konfigurasi pegas"> <!-poin konfigurasi-> <aop: pointcut id = "ID bagian" Ekspresi = "Eksekusi (*com.test.service ..*.* Metode di kelas bagian "/> <aop: setelah .../> ... </aop: aspek> </aop: config>
10. Pemrosesan Transaksi Musim Semi (Pemrosesan Transaksi Deklaratif Musim Semi):
Sederhananya, transaksi mengacu pada salah satu operasi paling mendasar dalam database. Penjelasan terperinci tentang transaksi akan dijelaskan secara rinci dalam ringkasan terkait database. Salah satu aplikasi terpenting dari pemrograman berorientasi Spring yang berorientasi (AOP) adalah manajemen transaksi. Manajemen transaksi Spring 2.5 dan versi yang lebih baru mendukung dua jenis metode berbasis anotasi dan metode berbasis file XML:
(1). Manajemen transaksi berdasarkan metode anotasi:
A. Tambahkan namespace manajemen transaksi dalam file konfigurasi pegas sebagai berikut:
xmlns: ts = http: //www.springframework.org/schema/tx http://www.springframework.org/schema/tx http://www.spramework.org/schema/tx
B. Konfigurasikan Transaction Manager dalam file konfigurasi pegas sebagai berikut:
<bean id = "txManager" class = "org.springframework.jdbc.datasource.datasourcetransactionManager"> <name properti = "DataSource" ref = "ID dari sumber data yang dikonfigurasi di musim semi"//>
C. Tambahkan item konfigurasi transaksi yang mendukung metode anotasi dalam file konfigurasi pegas adalah sebagai berikut:
<tx: anotasi-driventransaction-manager-tx: annotation-driventransaction-manager = ”txManager (ID dari manajer transaksi yang dikonfigurasi di musim semi)”/>
D. Gunakan manajemen transaksi berbasis anotasi:
Dalam proyek Javaee yang dikelola oleh Spring, logika bisnis transaksi perlu ditambahkan dengan anotasi "@transactional".
(2). Manajemen Transaksi Berdasarkan Metode File XML:
A. Konfigurasikan Transaction Manager dalam file konfigurasi pegas sebagai berikut:
<bean id = "txManager" class = "org.springframework.jdbc.datasource.datasourcetransactionManager"> <name properti = "DataSource" ref = "ID dari sumber data yang dikonfigurasi di musim semi"//>
B. Tambahkan bagian manajemen benda berikut dalam file konfigurasi pegas:
<AOP: config> <!-Mengkonfigurasi titik masuk transaksi-> <aop: pointcut id = "transactionpointcut" ekspresi = "eksekusi (*com.test.service ..*.*(..))"/> <!-Konfigurasikan notifikasi transaksi-> <AOP: Advisor Advice-Ref = "txadvice" pointcut-ref = "C. Tambahkan fitur berikut untuk pemberitahuan transaksi di file konfigurasi pegas:
<tx: nasihat id = "txadvice" transactionManager = "txManager"> <tx: atribut> <!-Berikut adalah contoh untuk mengatur metode kueri yang dimulai dengan mendapatkan hanya baca, dan tidak mendukung transaksi-> <tx: Metode nama = "get*" read-only = "true" propagation = "not_supported: Methods:" get*"read-only" true "propagation =" not_supported: Methody "get*" order-only = true "Propagation =" not_supported: Methody "get*" order-only "true" Propagation = "not_supported: Methody/> AD-on-only = true" Propagation = "not_supported: Method name = "*"/> </tx: Atribut> </tx: Saran>