Spring AOP: Apa perbedaan antara JoinPoint dan PointCut?


88

Saya sedang mempelajari konsep Pemrograman Berorientasi Aspek dan AOP Musim Semi. Saya gagal memahami perbedaan antara Pointcut dan Joinpoint - keduanya tampak sama bagi saya. Pointcut adalah tempat Anda menerapkan saran Anda dan Joinpoint juga merupakan tempat di mana kami dapat menerapkan saran kami. Lalu apa bedanya?

Contoh pointcut dapat berupa:

@Pointcut("execution(* * getName()")

Apa yang bisa menjadi contoh Joinpoint?

Jawaban:


161

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. masukkan deskripsi gambar di sini

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.


3
Ini harus ditandai sebagai jawaban yang benar. Hanya untuk menambahkan beberapa info lagi, lihat jawaban Cragi Walls ... coderanch.com/t/485525/Spring/Difference-Joint-Point-Point-Cut .
Victor

2
Langsung ke intinya: Sebuah pointcut menentukan saran joinpoint apa yang harus diterapkan +1
Naman Gala

Hanya untuk konfirmasi, more Joinpoints and apply an aspect to them, you've got a Pointcut. aspek untuk mereka atau saran untuk mereka?
Asif Mushtaq

@Premraj Jadi, menurut analogi Anda, saran akan memesan makanan. Apakah saya benar?
Vishwas Atrey

Analogi restoran membantu menghilangkan kebingungan antara JoinPoints dan pointcuts, Terima kasih!
SM

30

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).


1
"Pointcut mendefinisikan aturan yang mengatakan, saran harus diterapkan pada metode getName () yang ada di semua kelas dalam paket apa pun dan titik gabungan akan menjadi daftar semua metode getName () yang ada di kelas sehingga saran dapat diterapkan pada metode ini." Maaf, tapi ini semakin membingungkan. Bisakah Anda memberi saya analogi dalam skenario kehidupan sehari-hari dunia nyata?
Saurabh Patil

28

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.


1
Joinpoint - Tempat potensial untuk menerapkan / menjalankan kode saran. Pointcut - titik penghubung yang dipilih sebenarnya untuk melaksanakan saran.
pengguna104309

26

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:

  1. Kapan tindakan harus diambil - mis. Sebelum / Setelah eksekusi metode ATAU pada pengecualian
  2. Apa yang harus dilakukan jika cocok (mungkin hanya mencetak pesan)

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>


1
Saya baru mengenal AOP dan penjelasan ini membantu saya memahami hubungan antara Advice / Pointcuts / JoinPoints dengan cukup jelas.
Jatin Shashoo

Ini, Tuan, adalah penjelasan yang jauh lebih baik untuk seorang pemula. Terima kasih
Aakash

11

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.


9

Definisi

Sesuai dokumentasi:

Titik gabungan: titik selama eksekusi program, seperti eksekusi metode atau penanganan pengecualian.

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,

Pointcut : predikat yang cocok dengan poin gabungan .

Kemudian Anda mengasosiasikan apa yang harus dilakukan dengan Pointcut , muncullah Advice . Sesuai dokumentasi,

Advice dikaitkan dengan ekspresi pointcut dan dijalankan di titik gabungan mana pun yang cocok dengan pointcut.

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 mungkin
  • SomeAspect adalah aspek kami yang mencakup berbagai masalah keledai tersebut ExampleBusinessClass
  • somePointCut()adalah definisi dari potongan poin yang sesuai dengan poin gabungan kami
  • afterSomePointCut()adalah saran yang akan dieksekusi setelah somePointCut pemotongan poin kami yang sesuai dengan doYourBusiness() poin gabungan
  • beforeSomePointCut()juga merupakan saran yang cocok dengan semua publiceksekusi metode. Tidak seperti afterSomePointCut, yang ini menggunakan deklarasi potongan poin sebaris

Anda dapat melihat dokumentasinya jika Anda tidak mempercayai saya. saya harap ini membantu


1
Penjelasan sederhana. Hanya tiga teks kutipan yang cukup untuk dipahami. Terima kasih.
TRiNE

6

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".


4

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 .


3

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.


3

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.JoinPointkelas.


Jawaban yang bagus! Akhirnya saya mengerti perbedaannya!
Dante

2

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.


0

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.


-5

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.