Titik gabungan: Titik gabungan adalah titik kandidat dalam Eksekusi Program aplikasi tempat aspek dapat dicolokkan. Titik ini bisa menjadi metode yang dipanggil, pengecualian dilemparkan, atau bahkan bidang yang dimodifikasi. Ini adalah titik di mana kode aspek Anda dapat dimasukkan ke dalam aliran normal aplikasi Anda untuk menambahkan perilaku baru.
Saran: Ini adalah objek yang menyertakan pemanggilan API ke masalah luas sistem yang mewakili tindakan yang harus dilakukan pada titik gabungan yang ditentukan oleh sebuah titik.
Pointcut: Pointcut menentukan titik gabungan apa, Advice terkait harus diterapkan. Saran dapat diterapkan di titik gabungan mana pun yang didukung oleh kerangka kerja AOP. Tentu saja, Anda tidak ingin menerapkan semua aspek Anda di semua titik pertemuan yang memungkinkan. Pointcuts memungkinkan Anda untuk menentukan di mana Anda ingin saran Anda diterapkan. Seringkali Anda menentukan jalan pintas ini menggunakan kelas eksplisit dan nama metode atau melalui ekspresi reguler yang mendefinisikan kelas yang cocok dan pola nama metode. Beberapa kerangka kerja AOP memungkinkan Anda membuat pintasan dinamis yang menentukan apakah akan menerapkan saran berdasarkan keputusan waktu proses, seperti nilai parameter metode.
Gambar berikut dapat membantu Anda memahami Advice, PointCut, Joinpoints.
Sumber
Penjelasan Menggunakan Analogi Restoran: Sumber oleh @Victor
Saat Anda pergi ke sebuah restoran, Anda melihat sebuah menu dan melihat beberapa opsi untuk dipilih. Anda dapat memesan satu atau lebih item apa pun di menu. Tetapi sampai Anda benar-benar memesannya, itu hanyalah "kesempatan untuk makan". Setelah Anda memesan dan pelayan membawanya ke meja Anda, itu adalah makanan.
Titik gabungan adalah opsi pada menu dan Pintasan adalah item yang Anda pilih.
Joinpoint adalah peluang dalam kode bagi Anda untuk menerapkan aspek ... hanya peluang. Setelah Anda mengambil peluang itu dan memilih satu atau lebih Joinpoint dan menerapkan aspek padanya, Anda mendapatkan Pointcut.
Sumber Wiki :
Sebuah bergabung titik adalah titik dalam aliran kontrol dari program di mana aliran kontrol dapat tiba melalui dua jalur yang berbeda (IMO: itu sebabnya panggilan sendi).
Saran menjelaskan kelas fungsi yang memodifikasi fungsi lain
Sebuah pointcut adalah seperangkat bergabung poin.
more Joinpoints and apply an aspect to them, you've got a Pointcut.
aspek untuk mereka atau saran untuk mereka?Untuk memahami perbedaan antara titik gabungan dan titik potong, pikirkan pointcut sebagai menentukan aturan tenun dan titik gabungan sebagai situasi yang memenuhi aturan tersebut.
Dalam contoh di bawah ini,
@Pointcut("execution(* * getName()")
Pointcut mendefinisikan aturan yang mengatakan, saran harus diterapkan pada metode getName () yang ada di kelas mana pun dalam paket apa pun dan titik gabungan akan menjadi daftar semua metode getName () yang ada di kelas sehingga saran dapat diterapkan pada metode ini.
(Dalam kasus Musim Semi, Aturan akan diterapkan hanya pada biji yang dikelola dan saran hanya dapat diterapkan pada metode publik).
sumber
JoinPoints: Ini pada dasarnya adalah tempat dalam logika bisnis yang sebenarnya di mana Anda ingin memasukkan beberapa fungsi lain-lain yang diperlukan tetapi tidak menjadi bagian dari logika bisnis yang sebenarnya. Beberapa contoh JoinPints adalah: pemanggilan metode, pengembalian metode secara normal, metode melempar pengecualian, membuat instance objek, merujuk objek, dll ...
Pintasan: Pintasan adalah sesuatu seperti ekspresi reguler yang digunakan untuk mengidentifikasi titik gabungan. Pontcut diekspresikan menggunakan "bahasa ekspresi pointcut". Pointcut adalah titik-titik aliran eksekusi di mana perhatian lintas sektor perlu diterapkan. Ada perbedaan antara Joinpoint dan Pointcut; Titik gabungan lebih umum dan mewakili aliran kontrol apa pun di mana kami 'dapat memilih untuk' memperkenalkan perhatian lintas sektor sementara titik potong mengidentifikasi titik gabungan tersebut di mana 'kami ingin' memperkenalkan masalah lintas sektoral.
sumber
Penjelasan awam untuk seseorang yang baru mengenal konsep AOP. Ini tidak lengkap, tetapi akan membantu dalam memahami konsep. Jika Anda sudah terbiasa dengan jargon dasar, Anda bisa berhenti membaca sekarang.
Asumsikan Anda memiliki karyawan kelas normal dan Anda ingin melakukan sesuatu setiap kali metode ini dipanggil.
class Employee{ public String getName(int id){....} private int getID(String name){...} }
metode ini disebut JoinPoints . Kita memerlukan cara untuk mengidentifikasi metode ini sehingga framework dapat menemukan metode, di antara semua class.method yang telah dimuatnya. Jadi kami akan menulis ekspresi reguler untuk mencocokkan tanda tangan metode ini. Meskipun ada lebih dari itu seperti yang akan Anda lihat di bawah, tetapi secara longgar ekspresi reguler inilah yang mendefinisikan Pointcut . misalnya
* * mypackage.Employee.get*(*)
Pertama * adalah untuk pengubah public / private / protected / default. Kedua * adalah untuk tipe kembalian dari metode tersebut.
Tapi kemudian Anda juga perlu menceritakan dua hal lagi:
Kombinasi keduanya disebut Advice .
Seperti yang bisa Anda bayangkan, Anda harus menulis fungsi untuk bisa melakukan # 2. Jadi seperti inilah tampilannya untuk dasar-dasarnya.
Catatan: Untuk kejelasan, menggunakan kata REGEX sebagai ganti
* * mypackage.Employee.get*(*)
. Kenyataannya ekspresi penuh masuk ke dalam definisi.@Before("execution(REGEX)") public void doBeforeLogging() {....} <-- executed before the matching-method is called @After("execution(REGEX)") public void doAfterLogging() {....} <-- executed after the matching-method is called
Setelah Anda mulai menggunakan ini sedikit, Anda mungkin akan menentukan banyak saran @ After / @ Before / @ Around. The diulang ekspresi reguler pada akhirnya akan berakhir membuat hal-hal yang membingungkan dan sulit untuk mempertahankan. Jadi apa yang kami lakukan, kami hanya memberi nama pada ekspresi dan menggunakannya di mana pun di kelas Aspect.
@Pointcut("execution(REGEX)") <-- Note the introduction of Pointcut keyword public void allGetterLogging(){} <-- This is usually empty @Before("allGetterLogging") public void doBeforeLogging() {....} @After("allGetterLogging") public void doAfterLogging() {....}
BTW, Anda juga ingin menggabungkan seluruh logika ini dalam sebuah kelas, yang disebut Aspek dan Anda akan menulis sebuah kelas:
@Aspect public class MyAwesomeAspect{....}
Agar semua ini berfungsi, Anda harus memberi tahu Spring untuk mengurai kelas untuk membaca, memahami, dan mengambil tindakan pada kata kunci @ AOP. Salah satu cara untuk melakukannya adalah menentukan yang berikut ini di file xml config spring:
<aop:aspectj-autoproxy>
sumber
Membandingkan bahasa AOP seperti AspectJ dengan bahasa kueri data seperti SQL, Anda dapat memikirkan titik gabungan (yaitu semua tempat di kode tempat Anda dapat menenun kode aspek) sebagai tabel database dengan banyak baris. Sebuah pointcut seperti stamement SELECT yang dapat memilih subset dari baris / titik gabungan yang ditentukan pengguna. Kode sebenarnya yang Anda masukkan ke tempat-tempat yang dipilih itu disebut nasihat.
sumber
Definisi
Sesuai dokumentasi:
Anda dapat mempertimbangkan Poin Bersama sebagai peristiwa dalam pelaksanaan suatu program. Jika Anda menggunakan Spring AOP, ini bahkan terbatas pada pemanggilan metode. AspectJ memberikan lebih banyak fleksibilitas.
Tetapi Anda tidak pernah menangani semua acara karena Anda tidak makan semua makanan di menu saat Anda pergi ke restoran (saya tidak mengenal Anda, Anda mungkin saja! Tapi, tentu saja saya tidak). Jadi, Anda membuat pilihan acara untuk ditangani dan apa yang harus dilakukan dengannya. Ini dia Pointcuts . Sesuai dokumentasi,
Kemudian Anda mengasosiasikan apa yang harus dilakukan dengan Pointcut , muncullah Advice . Sesuai dokumentasi,
Kode
package com.amanu.example; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; /** * @author Amanuel Nega on 10/25/16. */ class ExampleBussinessClass { public Object doYourBusiness() { return new Object(); } } @Aspect class SomeAspect { @Pointcut("execution(* com.amanu.example.ExampleBussinessClass.doYourBusiness())") public void somePointCut() { }//Empty body suffices @After("somePointCut()") public void afterSomePointCut() { //Do what you want to do after the joint point is executed } @Before("execution(* *(*))") public void beforeSomePointCut() { //Do what you want to do before the joint point is executed } }
Penjelasan Kode
ExampleBusinessClass
ketika di-proxy-ed, adalah target kami!doYourBusiness()
adalah titik gabungan yang mungkinSomeAspect
adalah aspek kami yang mencakup berbagai masalah keledai tersebutExampleBusinessClass
somePointCut()
adalah definisi dari potongan poin yang sesuai dengan poin gabungan kamiafterSomePointCut()
adalah saran yang akan dieksekusi setelahsomePointCut
pemotongan poin kami yang sesuai dengandoYourBusiness()
poin gabunganbeforeSomePointCut()
juga merupakan saran yang cocok dengan semuapublic
eksekusi metode. Tidak sepertiafterSomePointCut
, yang ini menggunakan deklarasi potongan poin sebarisAnda dapat melihat dokumentasinya jika Anda tidak mempercayai saya. saya harap ini membantu
sumber
Keduanya berkaitan dengan "di mana" dari pemrograman berorientasi aspek.
Titik gabungan adalah tempat individu di mana Anda dapat mengeksekusi kode dengan AOP. Misalnya "ketika metode melempar pengecualian".
Pointcut adalah kumpulan poin gabungan. Misalnya "ketika metode di kelas Foo membuat pengecualian".
sumber
JoinPoint : Titik gabungan adalah titik dalam pelaksanaan program Anda di mana aliran pelaksanaan diubah seperti Penangkapan pengecualian, Memanggil metode lain.
PointCut : PointCut pada dasarnya adalah titik Gabungan tempat Anda dapat memberikan saran (atau memanggil aspek).
Jadi pada dasarnya PointCuts adalah bagian dari JoinPoints .
sumber
AOP di musim semi memiliki {Advisor, Advice, Pointcut, Joinpoint}
Seperti yang Anda ketahui, tujuan utama aop adalah memisahkan logika perhatian lintas sektor (Aspect) dari kode aplikasi, untuk mengimplementasikannya di Spring kami menggunakan (Saran / Penasihat)
Pointcut digunakan untuk memfilter tempat kami ingin menerapkan saran ini dengan tepat, seperti "semua metode dimulai dengan penyisipan" sehingga metode lain akan dikecualikan, itulah sebabnya kami memiliki antarmuka Pointcut {ClassFilter dan MethodMatcher}
Jadi Advice adalah implementasi logika lintas sektor dan Advisor adalah saran ditambah PointCut, jika Anda hanya menggunakan saran, spring akan memetakannya ke penasihat dan membuat pointcut BENAR yang berarti tidak memblokir apa pun. Itulah mengapa ketika Anda hanya menggunakan saran, itu diterapkan ke semua metode kelas target karena Anda tidak memfilternya.
Tetapi Joinpoint adalah sebuah lokasi dalam program, Anda dapat memikirkannya seperti refleksi ketika Anda mengakses objek Kelas dan kemudian Anda bisa mendapatkan objek Metode, lalu Anda dapat memanggil metode apa pun di kelas ini, dan begitulah cara kerja kompiler, jika Anda berpikir seperti itu. ini bisa Anda bayangkan Joinpoint.
Joinpoint bisa dengan field, konstruktor atau metode tapi di Spring kita punya joinpoint dengan metode saja, itu sebabnya di Spring kita punya tipe Joinpoint (Before, After, Throws, Around), semuanya mengacu pada lokasi di kelas.
Seperti yang saya sebutkan, Anda dapat memiliki saran tanpa titik potong (tanpa filter) kemudian akan diterapkan ke semua metode atau Anda dapat memiliki penasihat yang [saran + potongan poin] yang akan diterapkan pada metode tertentu tetapi Anda tidak dapat memiliki saran tanpa joinpoint seperti pointcut, Anda harus menentukannya, dan itulah mengapa jenis nasihat di musim semi persis jenis yang sama dengan titik sambungan jadi ketika Anda memilih saran Anda secara implisit memilih titik sambungan mana.
Sebagai kesimpulan, saran adalah logika implementasi untuk aspek Anda ke kelas target, saran ini harus memiliki titik gabungan seperti sebelum pemanggilan, setelah pemanggilan, setelah melempar atau sekitar pemanggilan, lalu Anda dapat memfilter di mana tepatnya Anda ingin menerapkannya menggunakan pointcut ke filter metode atau tanpa pointcut (tanpa filter) sehingga akan diterapkan ke semua metode kelas.
sumber
Pointcut ditentukan pada implementasi kelas Aspect. Potongan poin pada dasarnya mengacu pada ekspresi potongan poin dalam saran.
Misalnya,
@Before("execution(* app.purchase2.service.impl.*(..))") public void includeAddOns(RolesAllowed roles) { .. }
Cara di atas berarti, metode "includeAddOns" dipanggil sebelum memanggil (karena saran @Before) metode apa pun (dalam kelas dalam paket "app.purchase2.service.impl")
Seluruh anotasi disebut pointcut
@Before("execution(* app.purchase2.service.impl.*(..))")
Titik gabungan adalah pemanggilan metode sebenarnya, yang menggabungkan metode dalam paket "app.purchase2.service.impl" ke metode dalam kelas aspek "includeAddOns ()".
Anda dapat mengakses properti titik gabungan dengan
org.aspectj.lang.JoinPoint
kelas.sumber
Saya setuju dengan mgroves .. Pemotongan titik dapat dianggap sebagai kumpulan beberapa titik sambungan. Titik gabungan menentukan lokasi tertentu di mana saran dapat diterapkan, sedangkan titik potong mencerminkan daftar semua titik bersama.
sumber
JoinPoint: Ini menentukan titik (metode) dalam aplikasi tempat Advice akan dijalankan.
Pointcut: Ini adalah kombinasi dari JoinPoints, dan menentukan di mana Advice JoinPoint akan dieksekusi.
sumber
titik gabung adalah tempat di mana kami benar-benar menempatkan nasihat
tetapi titik potongnya adalah kumpulan poin gabungan. Itu berarti berapa banyak cara kita menempatkan logika lintas sektoral disebut titik potong
sumber