Ketika datang ke AOP, Anda pasti akan memikirkan musim semi karena hal ini terlalu kuat. Tetapi Anda harus jelas bahwa AOP adalah ide pemrograman, dan Spring hanyalah implementasi AOP.
Pertama, Baidu:
Dalam industri perangkat lunak, AOP adalah singkatan dari pemrograman yang berorientasi pada aspek, yang berarti: teknologi yang mengimplementasikan pemeliharaan fungsi program yang terpadu melalui metode prekompilasi dan agen dinamis selama runtime. AOP adalah kelanjutan dari OOP, topik hangat dalam pengembangan perangkat lunak, bagian penting dari kerangka kerja Spring, dan paradigma turunan dari pemrograman fungsional. 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.
Hari ini, mari kita gunakan proxy asli Java untuk mengimplementasikan fungsi AOP sederhana.
Pertama, Anda perlu mengetahui pengetahuan refleksi dasar, jika tidak, Anda mungkin merasa bingung.
Tidak ada lagi kata -kata, mulailah mengetik
Pertama, mari kita tulis antarmuka sederhana. Namanya AnimalInterface, yang digunakan untuk mendeklarasikan beberapa metode dasar untuk mengatur hewan.
Metode -metode ini termasuk menetapkan nama, mendapatkan nama, pemanggilan, dan atribut (maafkan saya karena tidak dididik, pada kenyataannya, untuk mendapatkan apakah itu terestrial atau perairan atau amfibi)
paket proxy.imp; antarmuka public animalInterface {// atur nama void setName (string name); // Dapatkan nama string getName (); // panggil void mengatakan (); // Dapatkan kekosongan permanen getProperty ();}Lalu kami menerapkan antarmuka ini dan membuat anjing bernama Xiao Hei
Paket proxy; impor proxy.imp.animalinterface; Dogimp kelas publik mengimplementasikan animalInterface {private string name = "xiaohei"; public dogimp () {} @Override public void setName (name string) {this.name = name; } @Override public string getName () {return this.name; } @Override public void mengatakan () {System.out.println ("Puppy: Wool Wool Wool ......"); } @Override public void getProperty () {System.out.println ("Puppy adalah hewan darat, tetapi bisa berenang"); }} Setiap orang harus tidak sabar untuk mewujudkan fungsi seperti AOP ...
Pertama -tama mari kita buat kelas yang disebut aophandle untuk mengimplementasikan antarmuka InvocationHandler. Ketika Anda tidak dapat menggunakan Invoke, proxy sebagai parameter refleksi, karena antarmuka objek proxy berbeda dari objek, mekanisme proxy ini berorientasi antarmuka daripada berorientasi pada kelas. Jika Anda menggunakan proxy, itu akan menyebabkan rekursi yang tak terbatas. Lalu ada stack overflow, tetapi masih bisa mencerminkan dengan sukses sekali. Ini menunjukkan bahwa objek proxy dan proxy objek berbeda. Namun, kami dapat memperoleh objek kelas melalui proxy.getClass () dari parameter proxy, dan kemudian mendapatkan metode dan parameter kelas proxy. Ini juga menyediakan metode implementasi untuk injeksi anotasi, injeksi metode spesifik, dan injeksi atribut. Mari kita bicarakan ini nanti.
Paket proxy; import java.lang.reflect.invocationHandler; import java.lang.reflect.method; kelas publik aophandle mengimplementasikan InvocationHandler {// simpan objek objek pribadi Objek o; aophandle publik (objek o) {this.o = o; } /** * This method will be called automatically, Java dynamic proxy mechanism* will be passed in the following parameter* @param Object proxy The interface of the proxy object, different from the object* @param Method method called method* @param Object[] args method parameters* When you cannot use invoke, proxy as reflection parameter, because the interface of the proxy object is different from object*. Mekanisme proxy ini berorientasi antarmuka, bukan orientasi kelas **/@Override Objek publik Invoke (Proxy Objek, Metode Metode, Object [] args) melempar Throwable {// metode pengembalian nilai objek ret = null; // Cetak Metode Nama System.err.println ("Metode Eksekusi:"+Method.GetName ()+"N Jenis Parameter adalah:"); // Parameter cetak untuk (tipe kelas: method.getParametertypes ()) system.err.println (type.getName ()); // Cetak Tipe Pengembalian System.err.println ("Tipe Data Pengembalian:"+Metode.GetReturnType (). GetName ()); // metode panggilan refleksi ret = method.invoke (o, args); // nyatakan end system.err.println ("Metode Execution End"); // return nilai pengembalian metode panggilan reflektif retir; }}Proxy dinamis telah selesai ... dan kemudian animalfactory kami ... dan mari kita lanjutkan
package proxy;import java.lang.reflect.Proxy;public class AnimalFactory { /*** * Get object method* @param obj * @return */ private static Object getAnimalBase(Object obj){ //Get proxy object return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass (). getInterfaces (), aophandle baru (OBJ)); } / **** Dapatkan metode objek* @param obj* @return* / @suppresswarnings ("Uncecked") public static t getanimal (objek obj) {return (t) getanimalbase (obj); } / **** Dapatkan metode objek* @param classname* @return* / @suppresswarnings ("Uncecked") public static t getanimal (string className) {objek obj = null; coba {obj = getanimalbase (class.forname (className) .newInstance ()); } catch (Exception e) {E.PrintStackTrace (); } return (t) obj; } / **** Dapatkan metode objek* @param clz* @return* / @suppressWarnings ("Uncecked") public static t getanimal (class clz) {objek obj = null; coba {obj = getanimalbase (clz.newinstance ()); } catch (Exception e) {E.PrintStackTrace (); } return (t) obj; }} Akhirnya akhir ... apa yang hilang? Datang ke sini untuk melihat efeknya ...
Haha ... pelayan, saya akan melayani ... oh ~ tidak, ini kategori tes ... haha ///
Paket Proxy; Impor org.junit.test; impor org.junit.runner.runwith; impor org.junit.runners.blockjunit4classrunner; impor proxy.animalctory; impor proxy.imp.animalinterface; @runwith (blockjunitit4claskclaskclasksrassrassrasse.animalinterface; @runwith (blockjunitsclaskclaskclaskclasksrassrassrasse.animalinterface; @runwith (blockjunitsclasclexclaskclaskclasksrassrass.Imp. {AnimalInterface dog = animalfactory.getanimal (dogimp.class); dog.say (); System.out.println ("Nama saya"+dog.getName ()); dog.setname ("ergouzi"); System.out.println ("Nama saya"+dog.getName ()); }} Apa? Apa, pada akhirnya, ini berguna, bukankah ini trik? Tangkap saja hal ini, apa gunanya ...
Jenis AOP apa, mengapa saya tidak melihat AOP, bagaimana saya bisa memasukkan metode kustom? Hanya masukan Syso, dan membodohi penonton ke dalam ini?….
Oke, mari kita lanjutkan dan lihat cara mengimplementasikan metode kustom yang disuntikkan ...
Pertama, tambahkan antarmuka, sebut saja antarmuka injeksi AOP. Sebutkannya aopmethod
Buat metode setelah dan sebelum, terima proxy objek, metode metode, objek [] args parameter
Ini akan melakukan lebih banyak hal ... misalnya, sebelum menjalankan metode, mencatat status kelas, menulis log. Pantau variabel xx ,,,
Buka otak Anda.
Paket proxy.imp; impor java.lang.reflect.method; antarmuka publik aopmethod {// metode dieksekusi sebelum metode instance dieksekusi batal setelah (proxy objek, metode metode, objek [] args); // Metode dieksekusi setelah metode instance dijalankan batal sebelumnya (Proxy Objek, Metode Metode, Object [] args);} Kemudian ubah kelas Aophandle dan tambahkan properti AOPMethod.
Ubah metode konstruktor untuk mendapatkan instance AOPMethod saat inisialisasi kelas.
Akhirnya Ubah Metode Invoke .... Pergi ke kode secara langsung
Paket proxy; import java.lang.reflect.invocationHandler; impor java.lang.reflect.method; impor proxy.imp.aopmethod; kelas publik aophandle mengimplementasikan InvocationHandler {// save objek metode aopmethod pribadi; objek pribadi o; aophandle publik (objek o, metode aopmethod) {this.o = o; this.method = metode; } /*** Metode ini akan disebut secara otomatis, mekanisme proxy dinamis java* Parameter berikut akan diteruskan ke dalam* @param objek proxy antarmuka objek proxy berbeda dari objek* @param metode yang disebut metode* @param objek PARAMETER PROXY ARG PARAMETER* Ketika diminta tidak dapat digunakan ketika proxy digunakan sebagai Param Param PROXY [] PARAMETER METODE PROYEKSE BEBERAP Berorientasi antarmuka, bukan orientasi kelas **/ @Override Objek publik Invoke (Proxy Object, Metode Metode, Objek [] args) melempar Throwable {objek ret = null; // Tempat modifikasi ada di sini this.method.before (proxy, metode, args); ret = method.invoke (o, args); // Tempat modifikasi ada di sini this.method.after (proxy, metode, args); kembali kembali; }} Huhu, tugas selesai, tampaknya semuanya menjadi masalah, lucu ...
Perbarui kelas tes sekarang ...
Paket proxy; impor java.lang.reflect.method; impor org.junit.runner.runwith; impor org.junit.runners.blockjunit4classrunner; impor proxy.impmethod; impor proxy.imp.animalInterlinterface; @runwith @runwith (blokir); static void main(String[] args) { AnimalInterface dog = AnimalFactory.getAnimal(DogImp.class, new AOPMethod() { // Here is the AOP cutting method before method execution public void before(Object proxy, Method method, Object[] args) { System.err.println("I'm in" + method.getName() + "Execute before method execution"); } // Here adalah metode pemotongan AOP setelah eksekusi metode public void setelah (proxy objek, metode metode, objek [] args) {System.err.println ("I'm in" + Method.getName () + "Jalankan setelah eksekusi metode"); dog.say (); String name1 = "nama saya" + dog.getName (); System.out.println (name1); dog.setname ("ergouzi"); String name2 = "My Name is"+dog.getName (); System.out.println (name2); }} Huhu, sayang, apakah kamu ingin menyuntikkan? Apakah Anda merasa telah memotong metode Anda sendiri ??? Ha ha…
Tampaknya semuanya sempurna, tetapi saya selalu merasa ada sesuatu yang hilang? Oh, ya, ada kekurangan file konfigurasi seperti Spring.
Bahkan, itu sudah sangat sederhana. Ayo serahkan mereka kepada Anda. Cukup rancang format XML dan tunggu, apa yang Anda katakan? Anda tidak dapat mencegat metode khusus?
Tidak dapat mencegat metode khusus seperti Spring? Oh ~~ tidak, sebenarnya, Anda dapat menggunakan metode dan methodname untuk membuat penilaian sebelumnya (proxy objek, metode metode, objek [] args) untuk menggunakan metode dan memberikan MethodName.
Tentu saja, contoh ini tidak memiliki signifikansi praktis, dan tidak dapat dibandingkan dengan berbagai kerangka kerja AOP yang sempurna. Artikel ini hanya memberi Anda cara berpikir, tetapi Anda harus ingat bahwa tidak peduli betapa hebatnya hal -hal itu, mereka diakumulasikan sedikit demi sedikit
Contoh Unduh: http://xiazai.vevb.com/201701/yuanma/javaaop_jb51.rar
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.