Pengenalan Ekspresi Titik Titik pada Musim Bunga

1. Gambaran keseluruhan

Dalam tutorial ini kita akan membincangkan bahasa ekspresi titik AOP musim bunga.

Kami pertama kali akan memperkenalkan beberapa istilah yang digunakan dalam pengaturcaraan berorientasikan aspek. A menyertai titik adalah satu langkah pelaksanaan program, seperti pelaksanaan kepada kaedah atau pengendalian pengecualian. Pada Spring AOP, titik bergabung selalu mewakili pelaksanaan kaedah. A pointcut ialah predikat yang sepadan dengan menyertai mata dan bahasa pointcut ungkapan adalah satu cara untuk menggambarkan pointcuts pengaturcaraan.

2. Penggunaan

Ungkapan titik boleh muncul sebagai nilai anotasi @Pointcut :

@Pointcut("within(@org.springframework.stereotype.Repository *)") public void repositoryClassMethods() {}

Deklarasi kaedah dipanggil tandatangan titik . Ini memberikan nama yang dapat digunakan oleh anotasi nasihat untuk merujuk kepada titik itu.

@Around("repositoryClassMethods()") public Object measureMethodExecutionTime(ProceedingJoinPoint pjp) throws Throwable { ... }

Ungkapan pointcut juga boleh muncul sebagai nilai ungkapan harta yang aop: pointcut tag:

3. Pereka Titik Titik

Ungkapan titik bermula dengan penunjuk titik jalan (PCD) , yang merupakan kata kunci yang memberitahu Spring AOP apa yang sesuai. Terdapat beberapa penunjuk titik titik, seperti pelaksanaan kaedah, jenis, argumen kaedah, atau anotasi.

3.1 pelaksanaan

PCD Spring utama adalah pelaksanaan , yang sepadan dengan titik gabungan pelaksanaan kaedah.

@Pointcut("execution(public String com.baeldung.pointcutadvice.dao.FooDao.findById(Long))")

Contoh pointcut akan sepadan dengan tepat pelaksanaan findById kaedah yang FooDao kelas. Ini berfungsi, tetapi tidak begitu fleksibel. Andaikan kami ingin memadankan semua kaedah kelas FooDao , yang mungkin mempunyai tandatangan, jenis pengembalian, dan argumen yang berbeza. Untuk mencapai ini, kami mungkin menggunakan kad liar:

@Pointcut("execution(* com.baeldung.pointcutadvice.dao.FooDao.*(..))")

Di sini wildcard pertama sepadan dengan nilai pulangan, yang kedua sesuai dengan mana-mana nama kaedah, dan corak (..) sepadan dengan sebilangan parameter (sifar atau lebih).

3.2 dalam

Cara lain untuk mencapai hasil yang sama dari bahagian sebelumnya adalah dengan menggunakan PCD dalam , yang menghadkan pencocokan untuk menyatukan titik dari jenis tertentu.

@Pointcut("within(com.baeldung.pointcutadvice.dao.FooDao)")

Kami juga dapat memadankan semua jenis dalam pakej com.baeldung atau sub-paket.

@Pointcut("within(com.baeldung..*)")

3.3 ini dan sasaran

ini had yang hampir sama untuk menyertai mata di mana rujukan kacang adalah contoh jenis yang diberikan, manakala sasaran had yang hampir sama untuk menyertai mata di mana objek sasaran adalah contoh dari jenis yang diberikan. Yang pertama berfungsi ketika Spring AOP membuat proksi berasaskan CGLIB, dan yang terakhir digunakan semasa proksi berasaskan JDK dibuat. Katakan bahawa kelas sasaran menerapkan antara muka:

public class FooDao implements BarDao { ... }

Dalam kes ini, Spring AOP akan menggunakan proksi berasaskan JDK dan anda harus menggunakan PCD sasaran kerana objek yang diproksi akan menjadi contoh kelas Proksi dan melaksanakan antara muka BarDao :

@Pointcut("target(com.baeldung.pointcutadvice.dao.BarDao)")

Sebaliknya jika FooDao tidak melaksanakan sebarang antara muka atau properti proxyTargetClass ditetapkan ke benar maka objek yang diproksi akan menjadi subkelas FooDao dan PCD ini dapat digunakan:

@Pointcut("this(com.baeldung.pointcutadvice.dao.FooDao)")

3.4 berhujah

PCD ini digunakan untuk memadankan argumen kaedah tertentu:

@Pointcut("execution(* *..find*(Long))")

Titik titik ini sesuai dengan kaedah apa pun yang bermula dengan mencari dan hanya mempunyai satu parameter jenis Long . Sekiranya kita ingin memadankan kaedah dengan sebilangan parameter tetapi mempunyai parameter tipe Long , kita boleh menggunakan ungkapan berikut:

@Pointcut("execution(* *..find*(Long,..))")

3.5 @target

The @target PCD (jangan dikelirukan dengan sasaran PCD diterangkan di atas) had yang hampir sama untuk menyertai mata di mana kelas objek melaksanakan mempunyai anotasi dari jenis yang diberikan:

@Pointcut("@target(org.springframework.stereotype.Repository)")

3.6 @args

PCD ini menghadkan padanan untuk bergabung dengan titik di mana jenis runtime argumen sebenar yang dilalui mempunyai anotasi dari jenis yang diberikan. Anggaplah bahawa kami ingin menelusuri semua kaedah penerimaan kacang yang dijelaskan dengan anotasi @Entity :

@Pointcut("@args(com.baeldung.pointcutadvice.annotations.Entity)") public void methodsAcceptingEntities() {}

Untuk mengakses argumen, kami harus memberikan argumen JoinPoint untuk mendapatkan nasihat:

@Before("methodsAcceptingEntities()") public void logMethodAcceptionEntityAnnotatedBean(JoinPoint jp) { logger.info("Accepting beans with @Entity annotation: " + jp.getArgs()[0]); }

3.7 @within

PCD ini menghadkan padanan untuk menggabungkan titik dalam jenis yang mempunyai anotasi yang diberikan:

@Pointcut("@within(org.springframework.stereotype.Repository)")

Yang bersamaan dengan:

@Pointcut("within(@org.springframework.stereotype.Repository *)")

3.8 @notasi

PCD ini menghadkan padanan untuk bergabung dengan titik di mana subjek titik bergabung mempunyai penjelasan yang diberikan. Sebagai contoh, kami mungkin membuat anotasi @Loggable :

@Pointcut("@annotation(com.baeldung.pointcutadvice.annotations.Loggable)") public void loggableMethods() {}

Kemudian kita boleh mencatat pelaksanaan kaedah yang ditandai dengan penjelasan itu:

@Before("loggableMethods()") public void logMethod(JoinPoint jp) { String methodName = jp.getSignature().getName(); logger.info("Executing method: " + methodName); }

4. Menggabungkan Ekspresi Titik Titik

Ungkapan titik boleh digabungkan menggunakan && , || dan ! pengendali:

@Pointcut("@target(org.springframework.stereotype.Repository)") public void repositoryMethods() {} @Pointcut("execution(* *..create*(Long,..))") public void firstLongParamMethods() {} @Pointcut("repositoryMethods() && firstLongParamMethods()") public void entityCreationMethods() {}

5. Kesimpulan

Dalam pengenalan ringkas untuk Spring AOP dan potongan titik, kami menggambarkan beberapa contoh penggunaan ungkapan titik.

Kumpulan contoh lengkap boleh didapati di GitHub.