AOP Saya pikir semua orang sangat jelas. Terkadang kita perlu memproses beberapa log permintaan, atau memantau beberapa metode, dan apa yang harus ditangani jika ada pengecualian? Sekarang, kami memperkenalkan AOP dari Spring-Boot.
[Lingkungan Pengembangan: Nomor Versi JDK adalah 1.8, Spring
Jumlah versi boot adalah 1.4.1] {style = ”latar belakang-warna:#ff0000”}
Pertama, kami akan memperkenalkan paket JAR terlebih dahulu.
File POM ditambahkan sebagai berikut:
<!-CITE AOP-> <dependency> <GroupId> org.springframework.boot </groupid> <Artifactid> Spring-boot-starter-aop </artifactid> </dependency> <!-mengutip gson, untuk pencetakan-> <groupid> <groupid> Com.google.code.gson </artacid </ARTIF> <ROVUMRUMID> COM.GOOGLE.CODE.GSON </ARTIF </ARTIF> <RUPREGLED> <Version> 2.7 </version> </gantisan>
Setelah memperkenalkan paket JAR, kami menambahkan dua metode pemrosesan permintaan sederhana untuk boot startup:
@SpringbootApplication (scanbasepackages = {"com"})@restcontrollerpublic kelas DemoApplication {public static void main (string [] args) {springApplication.run (demoApplication.class, args); } // uji permintaan GET tanpa argumen @RequestMapping (value = "/testaspect", method = requestMethod.get) public userVo test () {userVo userVo = new UserVo (); uservo.setage ("23"); uservo.setname ("he xiaowu"); uservo.setsex ("pria"); mengembalikan uservo; } // Uji permintaan GET dengan parameter, biarkan AOP mencetak konten parameter @RequestMapping (value = "/testaspectArgs", method = requestMethod.get) tes UServo publik (nama string, usia string, string sex) {userVo uservo = new userVo (); uservo.setname (name); uservo.setage (usia); uservo.setsex (seks); mengembalikan uservo; }Setelah menambahkan dua metode pemrosesan permintaan sederhana, mari tambahkan AOP kami
/** * Nama Proyek: SpringbootDemo * Pencipta: He Xiaowu * Waktu Penciptaan: 16/12/4 7:05 PM * Nama kelas: AspectDemo * Deskripsi kelas: * // Deklarasikan adalah bagian@aspek // menyatakan adalah logger yang dikelola musim semi@komponen@order (1) kelas publik aspekdemo {private Logger LOG = LOGGER yang dikelola Spring@component@order (1) Public Class PublicDemo {private LOGGER LOGERGER. Private GSON GSON = GSON baru (); //Declare a point in the execution expression @Pointcut("execution(public * com.example.DemoApplication.*(..))") private void controllerAspect(){} //Print the content before requesting the method @Before(value = "controllerAspect()") public void methodBefore(JoinPoint joinPoint){ ServletRequestAttributes requestAttributes = (ServletRequestAttributes) requestContextholder.getRequestAttributes (); HttpservletRequest request = requestAttributes.getRequest (); // Cetak konten permintaan log.info ("======================================================= ================================================================== ================================================================== =================================================================== ================================================================== =================================================================== ================================================================== =================================================================== // Cetak Konten Pengembalian Setelah Metode dieksekusi @AfterReturning (returning = "o", pointcut = "controllerAspect ()") MethodafterReturning publik (objek o) { log.info ("----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Setelah keduanya dikonfigurasi, kami meminta dan kemudian melihat log cetak. Pertama, mulailah wadah kami, dan kemudian kami pertama -tama meminta metode pemrosesan yang parameter. Log cetak adalah sebagai berikut:
{width = "1232"
tinggi = "132"}
Dapat ditemukan bahwa URL, metode, nilai parameter ARGS yang diminta, jenis, dan konten yang dikembalikan semuanya dicetak, menunjukkan bahwa ini adalah pencegat AOP dengan sukses.
Selanjutnya, kami menguji metode pemrosesan permintaan tanpa parameter, dan mencetak log sebagai berikut:
{width = "1100"
tinggi = "130"}
Kita dapat menemukan bahwa parameter metode yang dicetak dalam metode ini adalah array kosong karena metode ini tidak memerlukan passing parameter.
Di atas adalah referensi springboot AOP untuk pemrosesan log pemrosesan web. Berikut adalah beberapa anotasi utama untuk bagian AOP. Berikut ini hanyalah deskripsi dan penggunaan anotasi. Penulis tidak akan mengujinya secara rinci. Jika Anda tertarik, Anda dapat mengujinya sendiri:
Anotasi kelas:
@Aspect mendefinisikan kelas sebagai kelas aspek
@order (i) menandai prioritas pemrosesan kelas facet. Semakin kecil nilai I, semakin tinggi tingkat prioritas. PS: Anda dapat memberi anotasi pada kelas atau memberi anotasi metode.
Anotasi metode:
@Pointcut mendefinisikan metode sebagai potongan titik sebagai ekspresi, detail berikut
@Before menjalankan metode sebelum titik tangen, kontennya adalah titik tangen yang ditentukan
@Sethter mengeksekusi setelah pemotongan titik, sebelum kembali,
@AfterReturning dieksekusi setelah titik masuk dan kembali. Jika Anda ingin memproses parameter pengembalian beberapa metode, Anda dapat mengoperasikannya di sini.
@Around mengelilingi titik garis singgung, jalankan sebelum memasuki titik tangen, dan setelah titik garis singgung
@AFterThrowing melempar pengecualian setelah titik celah untuk diproses
@order (i) menandai prioritas titik potong. Semakin kecil i, semakin tinggi prioritasnya
Kombinasi anotasi @pointcut:
Dalam kode di atas, kami mendefinisikan titik tangen yang hanya memproses jalur yang ditentukan:
@Pointcut ("Eksekusi (publik * com.example.demoApplication. * (..))") private void controlleraspect () {}Sekarang, kami mendefinisikan titik singgung untuk menangani jalan lain:
@Pointcut ("Eksekusi (publik*com.demo.*.*(..))") private void controllerdemo () {}Poin singgung di atas semuanya diproses secara terpisah. Jika kita membutuhkan titik tangen untuk memproses keduanya, kita dapat mengonfigurasinya seperti ini:
@Pointcut (value = "controlleraspect () || controllerdemo ()") private void all () {} Dalam anotasi @pointcut, langsung merujuk ke nama metode lain yang dianotasi oleh @pointcut, sehingga potongan titik dapat menangani metode di bawah dua jalur
Ekspresi eksekusi anotasi @pointcut: publik*com.demo.*.*(..)
Metode pengubah publik pertama dapat menggunakan * alih -alih yang pertama * untuk mewakili nilai pengembalian, dan * mewakili semua
com.demo.* Jalur paket ,.* mewakili paket ketiga di jalur.* mewakili metode semua kelas di bawah semua paket di bawah jalur.
(..) berarti parameter metode tidak terbatas
Beberapa catatan tentang @order (i) Anotasi:
Kelas anotasi, semakin kecil nilainya, semakin tinggi prioritasnya, metode anotasi, kedua anotasi dijelaskan: @ebusalah, semakin kecil nilai I, semakin tinggi prioritas, semakin tinggi prioritas, semakin banyak anotasi: @After atau @Afterreturning, semakin besar nilai I, semakin tinggi prioritas.
Untuk meringkas keduanya, itu adalah:
Dalam operasi sebelum titik masuk, operasi setelah titik masuk dilakukan dengan nilai pesanan dari kecil ke besar, dan operasi setelah titik masuk dilakukan oleh nilai pesanan dari besar ke kecil
memperpanjang:
Beberapa pembaca mungkin bertanya, apakah saya ingin mencetak waktu yang diperlukan untuk permintaan dari yang masuk dan berakhir, mendefinisikan variabel anggota untuk menghitung waktu, dan memberikan @Before dan @Afterreturning akses, mungkin ada masalah sinkronisasi. Jadi kami merujuk ke objek threadlocal yang menentukan tipe generik. Waktu merekam permintaan di @Before dan mengurangi catatan di @Afterreturning adalah waktu yang dikonsumsi. Kodenya adalah sebagai berikut:
/** * Project name: SpringBootDemo * Creator: He Xiaowu* Creation time: 16/12/4 7:05 pm * Class name: AspectDemo * Class description: *///Declaration is a section @Aspect//Declaration is a spring managed bean@Component@Order(1)public class AspectDemo { private Logger log = Logger.getLogger(getClass()); Private GSON GSON = GSON baru (); Threadlocal <long> startTime = threadlocal baru <long> (); //Declare a point in the execution expression @Pointcut("execution(public * com.example.DemoApplication.*(..))") private void controllerAspect() { } //Print the content before requesting the method @Before(value = "controllerAspect()") public void methodBefore(JoinPoint joinPoint) { startTime.set(System.currentTimeMillis()); ServletRequestAttributes requestAttributes = (servletRequestAttributes) requestContextholder.getRequestAttributes (); HttpservletRequest request = requestAttributes.getRequest (); // Cetak konten permintaan log.info ("================================================================================================================================= ============================================================= ============================================================== ============================================================= ============================================================== ============================================================== ============================================================== Arrays.tostring (joinpoint.getArgs ())); log.info ("======================================================================================================================================================= Arrays.tostring (joinpoint.getArgs ())); log.info ("konten respons:" + gson.toJson (o)); log.info ("----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Di atas adalah semua hasil yang diperoleh dengan tes saya. Mungkin ada perbedaan atau kesalahan. Tolong perbaiki saya.
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.