JavaRush /Kurslar /All lectures for UZ purposes /Spring'да kesmalar (Pointcuts) API-интерфейси

Spring'да kesmalar (Pointcuts) API-интерфейси

All lectures for UZ purposes
Daraja, Dars
Mavjud

Tushunchalar

Spring'нинг kesmalar modeli maslahat turlaridan qat'iy nazar kesmalarni qayta ishlatishga imkon beradi. Har xil maslahat turlariga bir xil kesma orqali yo'naltirish mumkin.

org.springframework.aop.Pointcut interfeysi maslahatlarni ma'lum sinflar va metodlarga qaratish uchun ishlatiladigan markaziy interfeysdir. Quyida to'liq interfeys keltirilgan:

public interface Pointcut {
    ClassFilter getClassFilter();
    MethodMatcher getMethodMatcher();
}

Pointcut interfeysini ikki qismga ajratish sinf va metodlarni moslashtirish qismlarini qayta ishlatishga imkon beradi, shuningdek, nozik kompozitsiya operatsiyalarini amalga oshirish (masalan, boshqa method matcher bilan "birlashtirish" amalga oshirish) imkonini beradi.

ClassFilter interfeysi kesmani ma'lum maqsadli sinflar to'plami bilan cheklash uchun ishlatiladi. Agar matches() metodi har doim true qaytarsa, barcha maqsadli sinflar mos keladi. Quyidagi listingda ClassFilter interfeysining ta'rifi keltirilgan:

public interface ClassFilter {
    boolean matches(Class clazz);
}

MethodMatcher interfeysi odatda muhimroq bo'ladi. Quyida to'liq interfeys keltirilgan:

public interface MethodMatcher {
    boolean matches(Method m, Class<?> targetClass);
    boolean isRuntime();
    boolean matches(Method m, Class<?> targetClass, Object... args);
}

matches(Method, Class) metodi ma'lum kesma ma'lum metodga mos kelishini tekshirish uchun ishlatiladi. Bu hisoblash AOP proxy yaratishda amalga oshirilishi mumkin, bu esa har bir metod chaqiruvida tekshiruvning zaruriyatini bartaraf etadi. Agar ikki argumentli matches metodi ma'lum bir metod uchun true qaytarsa ​​va isRuntime() metodi MethodMatcher uchun true qaytarsa, uchta argumentli moslik metodi har bir metod chaqiruvida chaqiriladi. Bu kesmaga to'g'ri o'lchash maslahati bajarilishidan oldin metod chaqiruviga uzatilgan argumentlarni ko'rib chiqishga imkon beradi.

Aksariyat MethodMatcher implementatsiyalari statik bo'ladi, ya'ni ularning isRuntime() metodi false qaytaradi. Bunday holda, uchta argumentli matches metodi hech qachon chaqirilmaydi.

Imkoniyat bo'lsa, kesmalarni statik qiling, bu esa AOP-freymvorkiga AOP proxy yaratishda kesmalar hisoblash natijasini keshda saqlash imkonini beradi.

Kesmalar ustida operatsiyalar

Spring kesmalar ustida operatsiyalarni (ayniqsa, birlashtirish va kesishish) qo'llab-quvvatlaydi.

Birlashtirish har qanday kesma bilan mos keladigan metodlarni anglatadi. Kesishish esa ikkala kesma bilan mos keladigan metodlarni anglatadi. Birlashtirish, odatda, amaliy faoliyatdir. Kesmalarning Statik metodlar orqali org.springframework.aop.support.Pointcuts sinfidan yoki ayni paketdagi ComposablePointcut sinfidan foydalanishingiz mumkin.

AspectJ ifoda kesmalari

2.0 versiyasidan boshlab Spring tomonidan foydalaniladigan eng muhim kesma turi org.springframework.aop.aspectj.AspectJExpressionPointcut hisoblanadi. Bu kesma AspectJ kutubxonasi tomonidan taqdim etilgan, AspectJ ifoda kesmasi qatorini tahlil qilish uchun ishlatiladigan kesmadir.

AspectJ dan qo'llab-quvvatlanadigan primitiv kesmalar haqida oldingi bo'limda muhokama qilinadi.

Qulay kesmalar implementatsiyalari

Spring bir nechta qulay kesmalar implementatsiyalarini taqdim etadi. Ulardan ba'zilarini bevosita ishlatishingiz mumkin; boshqa ba'zilari esa qo'llanma uchun xos bo'lgan kesmalarda voris sinflarni yaratish uchun mo'ljallangan.

Statik kesmalar

Statik kesmalar metod va maqsadli sinfga asoslangan bo'lib, metod argumentlarini hisobga ololmaydi. Ko'pgina holatlarda statik kesmalar yetarli bo'lib, ular eng yaxshi tanlovdir. Agar metod birinchi marta chaqirilganda Spring statik kesmani hisoblay oladi. Shundan keyin har bir metod chaqiruvida kesmani qayta hisoblash zaruriyati bo'lmaydi.

Ushbu bo'limning qolgan qismida Spring'da mavjud bo'lgan ba'zi statik kesmalar implementatsiyalari tavsiflanadi.

Regulyar ifoda kesmalari

Statik kesmalarni belgilashning aniq yo'llaridan biri regulyar ifodalar hisoblanadi. Spring'dan tashqari bir nechta AOP-freymvorklar buni amalga oshirish imkonini beradi. org.springframework.aop.support.JdkRegexpMethodPointcut - bu umumiy regulyar ifoda kesmasi bo'lib, JDK'da regulyar ifodalar qo'llab-quvvatlanishini foydalanadi.

JdkRegexpMethodPointcut sinfi orqali namuna qatorlari ro'yxatini ko'rsatishingiz mumkin. Agar ulardan biri mos kelsa, kesma true qiymatini oladi. (Natijaviy kesma aslida ko'rsatilgan namunalarni birlashtiruvchi bo'ladi).

Quyidagi misolda qanday ishlatilishi ko‘rsatilgan

<bean id="settersAndAbsquatulatePointcut"
        class="org.springframework.aop.support.JdkRegexpMethodPointcut">
    <property name="patterns">
        <list>
            <value>.*set.*</value>
            <value>.*absquatulate</value>
        </list>
    </property>
</bean>

Spring RegexpMethodPointcutAdvisor qulay sinfini taqdim etadi, bu esa Advice (esingizda tuting, Advice bu "aralashish" maslahati, "oldingi" maslahati, "istisno yaratish" maslahati va boshqalar bo'lishi mumkin) ga murojaat qilish imkonini beradi. Spring sahna orqasida JdkRegexpMethodPointcutdan foydalanadi. RegexpMethodPointcutAdvisordan foydalanish bog'lanishni sodda holga keltiradi, chunki bitta bean kesma va maslahati sig'diradi, quyidagi misolda ko'rsatilgan:

<bean id="settersAndAbsquatulateAdvisor"
        class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
    <property name="advice">
        <ref bean="beanNameOfAopAllianceInterceptor"/>
    </property>
    <property name="patterns">
        <list>
            <value>.*set.*</value>
            <value>.*absquatulate</value>
        </list>
    </property>
</bean>

RegexpMethodPointcutAdvisor ni har qanday Advice turi bilan ishlatishingiz mumkin.

Attributlar bilan boshqariladigan kesmalar

Statik kesmaning muhim turi ma'lumotlar bilan boshqariladigan kesma hisoblanadi. Bu odatda ma'lumotlar atributlarining qiymatlari (odatda, manba darajasida) bilan ishlatiladi.

Dinamik kesmalar

Dinamik kesmalarni hisoblash resurs talab qiluvchi narsa. Ushbu kesmalar metod argumentlarini va statik ma'lumotlarni hisobga oladi. Bu esa, har bir metod chaqiruvida hisoblashni amalga oshirish kerakligini va natijani keshirolmasligini anglatadi, chunki argumentlar o'zgaradi.

Mahsus misol control flow kesmasidir.

Boshqaruv oqimi kesmalari

Spring'dagi boshqaruv oqimi kesmalari (control flow pointcuts) tushuncha jihatdan AspectJ'dagi cflow kesmalariga o'xshaydi, ammo u qadar samarali emas. (Hozirgi vaqtda boshqa kesma bilan mos keladigan biriktirma nuqtasidan past bo'lgan kesmani belgilash imkoniyati yo'q.) Boshqaruv oqimi kesmasi joriy chaqiruv steki bilan mos keladi. Masalan, agar biriktirma nuqtasi com.mycompany.web paketidagi metod orqali yoki SomeCaller sinfi orqali chaqirilgan bo'lsa, bu ishga tushishi mumkin. Boshqaruv oqimi kesmalari org.springframework.aop.support.ControlFlowPointcut sinfi orqali belgilanadi.

Boshqaruv oqimi kesmalarini hisoblash dastur ishlayotgan vaqti davomida boshqa dinamik kesmalardan ko'ra ancha ko'p resurs talab qiladi. Java 1.4 da xarajati boshqa dinamik kesmalardan taxminan besh baravar yuqori.

Kesma superklasslari

Spring sizga o'z kesmalaringizni amalga oshirishga yordam beradigan qulay kesma superklasslari (ota sinflarni) taqdim etadi.

Java
class TestStaticPointcut extends StaticMethodMatcherPointcut {
    public boolean matches(Method m, Class targetClass) {
        // true qaytaradi, agar maxsus belgilangan mezonlar mos keladi
    }
}
Kotlin
class TestStaticPointcut : StaticMethodMatcherPointcut() {
    override fun matches(method: Method, targetClass: Class<*>): Boolean {
        // true qaytaradi, agar maxsus belgilangan mezonlar mos keladi
    }
}

Dinamik kesmalar uchun ham superklasslar mavjud. Har qanday turdagi maslahatlar bilan maxsus kesmalarni ishlatishingiz mumkin.

Maxsus kesmalar

Spring AOP'dagi kesmalar AspectJ'dagi singari til funksiyalari emas, balki Java sinflari bo'lganligi sababli, statik va dinamik maxsus kesmalarni e'lon qilishingiz mumkin. Spring'dagi maxsus kesmalar ixtiyoriy murakkab bo'lishi mumkin. Ammo imkoniyat bo'lsa, AspectJ kesma ifoda tilidan foydalanishni tavsiya qilinadi.

Spring'нинг keyingi versiyalari "semantik kesmalar"ni qo'llab-quvvatlashni ta'minlashi mumkin, masalan, JAC'ta taklif qilinganidek - "maqsadli obyektdagi misol o'zgaruvchilarini o'zgartiradigan metodlar".
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION