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:
- Kapan tindakan harus diambil - mis. Sebelum / Setelah eksekusi metode ATAU pada pengecualian
- 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>