Sebelum membaca artikel ini, Anda dapat merujuk pada artikel " Pemahaman Sederhana tentang IOC dan Contoh AOP dan kode Spring " untuk secara singkat memahami konten yang relevan dari IOC dan AOP. Mari kita ke topik.
Artikel ini akan membuat contoh paling sederhana langkah demi langkah untuk menggunakan fitur AOP Spring, yang dianggap sebagai demo pemula Spring AOP. Sebagai seorang pemula, menjalankan demo sederhana seperti itu juga telah dilanda banyak jebakan.
Masalah OOP, Tambahan ke AOP
Ketika kita perlu memperkenalkan perilaku publik ke benda -benda yang tersebar, OOP tampaknya tidak berdaya. Artinya, OOP memungkinkan Anda untuk mendefinisikan hubungan dari atas ke bawah, tetapi tidak cocok untuk mendefinisikan hubungan dari kiri ke kanan. Misalnya, fungsi logging. Kode log sering tersebar secara horizontal di semua level objek tanpa hubungan dengan fungsi inti dari objek yang tersebar. Hal yang sama berlaku untuk jenis kode lainnya, seperti keamanan, penanganan pengecualian, dan transparansi. Kode yang tidak relevan semacam ini tersebar di mana-mana disebut kode lintas-potong. Dalam desain OOP, itu menyebabkan banyak duplikasi kode, yang tidak kondusif untuk penggunaan kembali setiap modul.
Apa yang disebut "aspek", sederhananya, merangkum logika atau tanggung jawab yang tidak terkait dengan bisnis tetapi disebut bersama oleh modul bisnis, yang memfasilitasi pengurangan duplikasi kode sistem, mengurangi kopling antara modul, dan mempromosikan operabilitas dan pemeliharaan di masa depan.
Dukungan untuk AOP di Musim Semi
Agen AOP di musim semi bertanggung jawab untuk generasi dan pengelolaan wadah IOC musim semi, dan ketergantungannya juga dikelola oleh wadah IOC. Oleh karena itu, proxy AOP dapat secara langsung menargetkan instance kacang lainnya dalam wadah, dan hubungan ini dapat disediakan dengan injeksi ketergantungan wadah IOC. Spring menggunakan java proxy dinamis untuk membuat proxy AOP secara default, sehingga dapat membuat proxy untuk setiap instance antarmuka apa pun. Ketika kelas yang membutuhkan proxy bukan antarmuka proxy, Spring akan secara otomatis beralih ke menggunakan proxy CGLIB, dan juga dapat memaksa CGLIB.
Logika contoh ini adalah sebagai berikut: Ada kelas mobil (kelas bisnis). Sebelum dan sesudah metode GO di kelas mobil dijalankan, akan ada catatan log yang sesuai, tetapi kelas mobil itu sendiri tidak tahu logika log.
Buat proyek Maven dan tambahkan dependensi
Pertama, buat proyek Maven baru, gunakan template MaveNarchetypequickStart, lalu buka file pom.xml, dan tambahkan paket ketergantungan yang diperlukan agar pegas AOP dapat dijalankan.
<dependency> <GroupId> org.springframework </groupid> <ArtiFacTId> Spring-core </arttifactid> <version> 4.0.5.release </version> </dependency> <dependency> </org.springframework </groupid> <ArtifactId> Spring-beans </Artifactid> </groupid </artifactid </versi </versi </versi </versi </versi </versi </versi </versi </versi </versi </versi </versi </versi </versi </versi </versi </versi </versi </versi </version. <groupId> org.springframework </groupid> <ArTifactId> Spring-Context </arttifactid> <version> 4.0.5.release </version> </dependency> <dependency> <groupid> org.springframework </sroupid> <Artifactid> Spring-Context </artifactid> </groupid> <artifactid> Spring-Context </artifactid> </groupid> <artifactid> </version> <trotifrice./version. <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>4.0.5.RELEASE</version></dependency><dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.1</version></dependency>
Menulis kode bisnis
Menambahkan mobil kelas bisnis, termasuk metode go ()
Paket com.wowo.spring_aop_demo1; mobil kelas publik {public void go () {System.out.println ("Go Go!"); }}Tulis segi
Kelas log akan merekam operasi sistem, tetapi logika log tidak akan ditulis di mana -mana di kelas bisnis, tetapi ada sebagai kelas faset.
Paket com.wowo.spring_aop_demo1; kelas publik carlogger {public void beForerun () {System.out.println ("CAR akan berjalan"); } public void afterrun () {System.out.println ("CAR sedang berjalan"); }}Kelas aspek ini berisi dua metode, yaitu pra-notifikasi dan pasca-notifikasi.
Konfigurasikan Asosiasi Melalui Kacang
Menambahkan file konfigurasi baru, bernama bean.xml dalam contoh ini, untuk mengaitkan wajah dan pemberitahuan dalam file konfigurasi
<? XML Versi = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmls xmlns: p = "http://www.springframework.org/schema/p" xmlns: context = "http://www.springframework.org/schema/context" xmlns: aop = "http:/schema/context" xmlns: aop = "http:/schema XSI: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-weans-2.4.xsd http:/wwww.springframework.orgaMory http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.spramework.org/schema/aop http: <bean id = "logger" /> <aop: config> <aop: aspek ref = "logger"> <aop: pointcut ekspresi = "eksekusi (* com.wowo.spring_aop_demo1.car.go (..))" ID = "go" /> <aop: Sebelum pointcut-ref = "go" method = for "method = for" go for = for "go" /> Method = "afterrun"/> </aop: aspek> </aop: config> </boy>
Catatan: Dalam file konfigurasi ini, namespace AOP dan beberapa alamat yang terkandung dalam XSI: SkemaLocation diperlukan.
Eksekusi (* com.wowo.spring_aop_demo1.car.go (..)) adalah ekspresi titik-potong aspek. Eksekusi berarti memicu selama eksekusi. Yang berikut ini mewakili nilai pengembalian jenis apa pun. com.wowo.spring_aop_demo1.car mengacu pada kelas di mana titik-potong berada. go (..) adalah nama metode, dan ... mewakili parameter apa pun.
Ada 5 jenis pemberitahuan yang dapat diterapkan pada bagian pegas:
・Sebelum-panggilan pemberitahuan dipanggil sebelum metode ini disebut
・Setelah-pemberitahuan dipanggil setelah metode selesai, terlepas dari apakah metode ini berhasil dieksekusi.
・Setelah kembali-panggilan pemberitahuan dipanggil setelah metode ini berhasil dieksekusi
・Setelah melempar-Hubungi pemberitahuan setelah metode melempar pengecualian
・Sekitar-Paket Notifikasi Metode yang diberitahukan, dan melakukan perilaku khusus sebelum dan sesudah panggilan metode yang diberitahu.
Jalankan kode bisnis
Di bawah ini adalah kelas yang berisi metode utama () untuk menjalankan kode bisnis
package com.wowo.spring_aop_demo1;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class App { public static void main( String[] args ) { ApplicationContext context = new ClasspathxmlapplicationContext ("bean.xml"); Mobil mobil = (mobil) context.getbean ("mobil"); muatan(); }}Dalam kode di atas, objek mobil dibuat oleh Spring. Ketika Spring membuat objek ini, ia menemukan bahwa salah satu metodenya dikonfigurasi sebagai pointcut. Oleh karena itu, saat instantiasi objek, objek proxy akan dibuat. Ketika metode point-cut GO () dieksekusi, itu akan dicegat oleh objek proxy yang dibuat oleh Spring. Sebelum menjalankan metode GO, ia akan memanggil pra-proses pra-proses pra-proses yang sesuai (), kemudian hubungi metode car.go (), dan kemudian hubungi pasca-proses dari bagian-pemotongan carlogger afterrun ().
Catatan: Musim semi harus digunakan untuk membuat objek yang berisi garis singgung. Jika Anda membuatnya sendiri, Spring tidak dapat memantau dan operasinya tidak akan diberitahu dengan menerapkan aplikasi apa pun.
Hasil output dari proyek adalah
Mobil akan pergi ke Rungo Go! Mobil sedang berjalan
Gunakan pemberitahuan surround
Jika Anda ingin menggunakan pemberitahuan surround, kami perlu memodifikasi metode pemberitahuan dan file konfigurasi di kelas Aspek. Kelas bisnis tidak perlu melakukan modifikasi apa pun karena mereka sepenuhnya dipisahkan. Pertama -tama ubah bagian kelas carlogger
impor org.aspectj.lang.promedingjoinPoint; kelas publik carlogger {public void outseRun (ProsidingjoinPoint gabungan) {System.out.println ("Mobil akan berjalan"); Coba {// Memanggil metode target objek proxy, dalam contoh ini menunjuk ke metode car.go () joinpoint.proed (); } catch (throwable e) {e.printstacktrace (); } System.out.println ("CAR sedang berjalan"); }}Metode di sekitar pemberitahuan perlu menerima parameter tipe ProceedingjoinPoint, dan metode prosesnya () akan memanggil metode target objek proxy, jadi dalam keadaan normal, metode ini harus dipanggil. Kami juga dapat mengatur menjalankan objek proxy dengan tidak memanggil metode ini.
Selanjutnya, ubah bagian AOP: konfigurasi file konfigurasi ke yang berikut
<AOP: config> <aop: aspek ref = "logger"> <aop: pointcut ekspresi = "eksekusi (* com.wowo.spring_aop_demo1.car.go (..))" id = "go"/> <aop: sekitar metode = "keliling" pointcut-ref = "go"//aop: aoT Method = outrun "pointcut-ref =" go "//aop: aop: aroundrun" pointcut-ref = "Go"
Catatan: Pemberitahuan surround tidak dapat ada pada saat yang sama dengan pemberitahuan depan/belakang. Setelah menjalankan kode, hasil output tetap tidak berubah.
Meringkaskan
Di atas adalah semua konten yang dibagikan oleh artikel ini tentang pengantar demo AOP Spring, saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!