Agar vazifani bajarishda aspektlardan foydalanish eng yaxshi yechim deb qaror qilingan bo'lsa, nima foydalanishni tushunish kerak - Spring AOP yoki AspectJ, shuningdek, Aspect tili (kodi) uslubini, @AspectJ annotatsiya uslubini yoki Spring XML uslubini tanlash? Bu tanlovga bir qator omillar ta'sir ko'rsatadi, jumladan, ilova talablari, rivojlantirish vositalari va jamoaning AOP bilan tanishuvi.
Spring AOP yoki to'liq funktsional AspectJ?
Ishlaydigan eng oddiy yechimdan foydalaning. Spring AOP, to'liq funktsional AspectJdan ko'ra ishlatishda osonroq, chunki AspectJ kompilyatori/bog'lovchi vositani rivojlantirish va yig'ish jarayonlariga joriy qilish kerak emas. Agar sizga faqat Spring binlarida operatsiyalarni bajarishni boshqarish kerak bo'lsa, Spring AOP to'g'ri tanlovdir. Agar sizga Spring konteyneri tomonidan boshqarilmaydigan obyektlarga maslahat berish kerak bo'lsa (masalan, odatda domen obyekti), AspectJni ishlatish kerak. Shuningdek, agar metodlarning oddiy bajarilishidan tashqari birlashish nuqtalariga maslahat berish kerak bo'lsa (masalan, field get yoki set birlashish nuqtalari va hokazo), AspectJdan foydalanish kerak.
Agar AspectJdan foydalanayotgan bo'lsangiz, AspectJ tili sintaksisi (shuningdek, "kod uslubi" sifatida tanilgan) va @AspectJ annotatsiya uslubi orasida tanlov qilishingiz mumkin. Aftidan, agar Java 5+ ishlatilmasa, tanlov allaqachon qilingan: Kod uslubidan foydalaning. Agar aspektlar loyihangizda katta rol o'ynasa va siz AspectJ Development Tools (AJDT) pluginini Eclipse uchun ishlatishingiz mumkin bo'lsa, AspectJ tili sintaksisi afzal qilingan variant hisoblanadi. Bu yanada toza va oddiy, chunki bu til aynan aspektlar yozish uchun ishlab chiqilgan. Agar siz Eclipse ishlatmayotgan bo'lsangiz yoki bir necha aspektlar sizning ilovangizda katta rol o'ynamasa, siz Java kompilyatsiyasida odatiy IDEingizda @AspectJ uslubidan foydalanishni ko'rib chiqishingiz mumkin va yig'ish ssenariga bog'lanish bosqichini qo'shib qo'yishingiz mumkin.
@AspectJ yoki XML Spring AOP uchun?
Agar Spring AOPdan foydalanishga qaror qilgan bo'lsangiz, @AspectJ yoki XML uslubi orasida tanlov qilishingiz mumkin. Turli xil kompromislarga e'tibor berish kerak.
XML uslubi mavjud Spring foydalanuvchilariga eng tanish bo'lishi mumkin va bu haqiqiy POJO ni qo'llab-quvvatlaydi. Agar AOP korporativ xizmatlarni sozlash vositasi sifatida ishlatilsa, XML yaxshi tanlov bo'lishi mumkin (masalan, siz konfiguratsiya qismi bo'ladimi deb o'ylaysizmi, degan savolga javob bersangiz yaxshi sinov bo'lar edi). XML uslubi yordamida sizning konfiguratsiyadan tizimda qanday aspektlar mavjudligi aniq bo'ladi.
XML uslubining ikki kamchiligi mavjud. Birinchidan, bu ular yechimini topgan vazifani amalga oshirishni to'liq bitta joyda inkapsulyatsiya qilmaydi. "O'zingni takrorlama" (Don’t repeat yourself/DRY) printsipi shuni anglatadiki, bilimning har bir qismi tizim doirasida yagona, ziddiyatsiz va mutlaq vakillikka ega bo'lishi kerak. XML uslubidan foydalanishda bilimlar, vazifa qanday amalga oshirilishi, asosiy bin sinfi va konfiguratsion fayldagi XMLda tarqatiladi. Agar siz @AspectJ uslubidan foydalansangiz, bu ma'lumot bitta modulda joylashgan: aspektda. Ikkinchidan, XML uslubi ifodaviylik jihatidan biroz cheklangan: faqat bitta aspekt nusxasini yaratish modeli qo'llab-quvvatlanadi, va XMLda e'lon qilingan nomlangan kesishlarni birlashtirib bo'lmaydi. Masalan, @AspectJ uslubida quyidagi kabi yozish mumkin:
// Mulkka kirish uchun nuqta kesimi
@Pointcut("execution(* get*())")
public void propertyAccess() {}
// Hisob qaydnomasi obyektini qaytaradigan operatsiya uchun nuqta kesimi
@Pointcut("execution(org.xyz.Account+ *(..))")
public void operationReturningAnAccount() {}
// propertyAccess() va operationReturningAnAccount() ni birlashtirish
@Pointcut("propertyAccess() && operationReturningAnAccount()")
public void accountPropertyAccess() {}
// Mulkka kirish uchun nuqta kesimi
@Pointcut("execution(* get*())")
fun propertyAccess() {}
// Hisob qaydnomasi obyektini qaytaradigan operatsiya uchun nuqta kesimi
@Pointcut("execution(org.xyz.Account+ *(..))")
fun operationReturningAnAccount() {}
// propertyAccess() va operationReturningAnAccount() ni birlashtirish
@Pointcut("propertyAccess() && operationReturningAnAccount()")
fun accountPropertyAccess() {}
XML uslubida birinchi ikki kesim e'lon qilinishi mumkin:
<aop:pointcut id="propertyAccess"
expression="execution(* get*())"/>
<aop:pointcut id="operationReturningAnAccount"
expression="execution(org.xyz.Account+ *(..))"/>
XML yondashuvining kamchiligi shundaki, bu ta'riflarni birlashtirib, accountPropertyAccess kesimini aniqlab bo'lmaydi.
@AspectJ uslubi qo'shimcha nusxa yaratish modellari va boyroq kesim kompozitsiyasini qo'llab-quvvatlaydi. Uning afzalligi shundan iboratki, aspektni modul birlik sifatida saqlaydi. Yana bir afzallik shundaki, @AspectJ aspektlari Spring AOP va AspectJ sifatida tanilishi (va shuning uchun ishlatilishi) mumkin. Shunday qilib, agar kelajakda boshqa vazifalarni bajarish uchun AspectJ imkoniyatlari talab qilinsa, klassik AspectJ konfiguratsiyasiga osongina o'tish mumkin. Umuman olganda, Spring jamoasi korporativ xizmatlarni oddiy konfiguratsiyasidan tashqarida maxsus aspektlar uchun @AspectJ uslubini afzal ko'radi.
Aspekt turlarini aralashtirib ishlatish
Bitta konfiguratsiyada @AspectJ uslubida yozilgan aspektlarni avtomatik proksi vositalaridan foydalangan holda, <aop:aspect> sxemalarida belgilangan aspektlar, <aop:advisor> maslahat beruvchilar va hatto boshqa uslublarda yozilgan proksi va kesuvchi vositalarni aralashtirib ishlatish mumkin. Ularning barchasi bir xil asosiy qo'llab-quvvatlash mexanizmi yordamida amalga oshiriladi va biron bir muammosiz birga mavjud bo'lishi mumkin.
GO TO FULL VERSION