Rumah  >  Artikel  >  Java  >  Mengapa Aspek AOP saya Tidak Dikenakan dalam Panggilan Kaedah Bersarang?

Mengapa Aspek AOP saya Tidak Dikenakan dalam Panggilan Kaedah Bersarang?

Susan Sarandon
Susan Sarandonasal
2024-10-31 15:51:02390semak imbas

Why is my AOP Aspect Not Invoked in Nested Method Calls?

Panggilan Nested Method dan Spring AOP

Pertimbangkan kod berikut dalam ABC.java:

<code class="java">public void method1() {
    // ...
    method2();
    // ...
}

public void method2() {
    // ...
    // ...
}</code>

Menambah AOP pada method2 melibatkan penciptaan aspek , AOPLogger, mengandungi kaedah untuk menyemak akses, checkAccess. Konfigurasi Spring termasuk:

<code class="xml"><bean id="advice" class="p.AOPLogger" />
<aop:config>
    <aop:pointcut id="abc" expression="execution(*p.ABC.method2(..))" />
    <aop:aspect id="service" ref="advice">
        <aop:before pointcut-ref="abc" method="checkAccess" />
    </aop:aspect>
</aop:config></code>

Walau bagaimanapun, aspek, checkAccess, tidak digunakan apabila kaedah2 dipanggil. Apa yang kurang?

Proksi AOP dan Suntikan Kacang

AOP berfungsi dengan menggunakan aspek pada proksi yang mengelilingi kacang. Apabila kacang dirujuk, ia bukan kelas instantiate tetapi kelas sintetik yang mewakilkan kepada kelas sebenar dan menambahkan fungsi seperti AOP.

Dalam contoh, method2 dipanggil terus pada kelas. Apabila disuntik sebagai Spring bean, kelas yang disertakan disuntik sebagai proksinya, mencetuskan aspek pada panggilan kaedah.

Untuk menggunakan AOP pada panggilan kaedah bersarang, pertimbangkan pilihan berikut:

  1. Pemisahan Kacang: Pisahkan kaedah1 dan kaedah2 kepada kacang yang berasingan.
  2. Rangka Kerja AOP Bukan Musim Bunga: Gunakan rangka kerja AOP yang tidak berorientasikan Spring untuk kawalan yang lebih terperinci ke atas aplikasi aspek.

Dokumentasi Spring menyediakan butiran lanjut dan kemungkinan penyelesaian.

Atas ialah kandungan terperinci Mengapa Aspek AOP saya Tidak Dikenakan dalam Panggilan Kaedah Bersarang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn