JavaRush /Kurslar /All lectures for UZ purposes /Spring orqali AspectJ yordamida domen obyektlarini depend...

Spring orqali AspectJ yordamida domen obyektlarini dependency sifatida kiritish

All lectures for UZ purposes
Daraja, Dars
Mavjud

Spring konteyneri ilovangiz kontekstida aniqlangan beansdan nusxalar yaratadi va sozlaydi. Shuningdek, bean zavodiga allaqachon mavjud bo'lgan obyektni sozlashini so'rashingiz mumkin, kerakli konfiguratsiyani o'z ichiga olgan bean ta'rifining nomini ko'rsatib. spring-aspects.jar bu imkoniyatdan foydalanib, har qanday obyekt uchun dependency injectionni amalga oshiruvchi annotatsiyalar boshqariladigan aspektni o'z ichiga oladi. Bu qo'llab-quvvatlash, hech qanday konteyner nazoratidan tashqarida yaratilgan obyektlar uchun mo'ljallangan. Domen obyektlari ko'pincha ushbu toifaga kiradi, chunki ular odatda new operatori yoki ORM vositasi yordamida dasturiy ravishda yaratiladi yoki ma'lumotlar bazasidan so'rov orqali olinadi.

@Configurable annotatsiyasi klassni Spring asosidagi konfiguratsiyaga mos ekanligini ko'rsatadi. Eng oddiy holatda, uni faqat marker annotatsiyasi sifatida ishlatishingiz mumkin, quyidagi misolda ko'rsatilganidek:

Java
package com.xyz.myapp.domain;
import org.springframework.beans.factory.annotation.Configurable;
@Configurable
public class Account {
    // ...
}
Kotlin
package com.xyz.myapp.domain
import org.springframework.beans.factory.annotation.Configurable
@Configurable
class Account {
    // ...
}

Spring, marker interfeys sifatida foydalanilganda, yangi annotatsiyalangan turdagi obyektlar (Account) prototip darajasida ko'rinadigan bean ta'rifi yordamida (odatda bir xil turdagi to'liq nom bilan) sozlaydi. Bean uchun standart nom - turining to'liq nomi bo'lgani uchun, prototip ta'rifini e'lon qilishning qulay usuli - id atributini qoldirishdir, quyidagi misolda ko'rsatilganidek:

<bean class="com.xyz.myapp.domain.Account" scope="prototype">
    <property name="fundsTransferService" ref="fundsTransferService"/>
</bean>

Agar siz keyinchalik foydalanish uchun mo'ljallangan bean-prototip ta'rifi nomini aniq ko'rsatish kerak bo'lsa, buni bevosita annotatsiyada amalga oshirishingiz mumkin, quyidagi misolda ko'rsatilganidek:

Java
package com.xyz.myapp.domain;
import org.springframework.beans.factory.annotation.Configurable;
@Configurable("account")
public class Account {
    // ...
}
Kotlin
package com.xyz.myapp.domain
import org.springframework.beans.factory.annotation.Configurable
@Configurable("account")
class Account {
    // ...
}

Endi Spring account nomli bean ta'rifini izlaydi va uni yangi Account nusxalarini sozlash uchun ishlatadi.

Ancha ilustratsiya jarayonini ko'rsatmaslik uchun, siz bemalol @Configurable annotatsiyani annotate qilgan bitta sinflar uchun aniq, annotations asosidagi dependency injectionni belgilash uchun delle @Autowired va @Injectni ishlatishingiz mumkin. Spring, anotatsiyalar @Configurable, @Autowired yoki @Injectlarning maydon yoki usul darajalari orqali avtomatik ravishda kashf qilish va bog'lashni amalga oshirishga imkon beradi.

Nihoyat, dependencyCheck atributi (masalan, @Configurable(autowire=Autowire.BY_NAME,dependencyCheck=true)) orqali yangi yaratilgan ob'ektda mavjud bo'lgan ob'ekt havolalari uchun Spring dependency checkni yoqishingiz mumkin. Agar bu atribut true ahamiyatiga ega bo'lsa, Spring konfiguratsiyani tugatgandan so'ng, barcha xossalar to'ldirilganligiga ishonch hosil qiladi.

Annotatsiyadan faqat foydalanish yetarli emasligini unutmang. Aslida, AnnotationBeanConfigurerAspect qisman spring-aspects.jar mavjud bo'lgan annotatsiyada harakat qiladi. Aslida, aspekt shunday deydi: “ yangi @Configurable turi ob'ektining tugagandan keyin, Spring orqali yangi yaratilgan ob'ektni annotatsiya xususiyati orqali konfiguratsiya qiling”. Bu kontekstda “initilizatsiya qilinishi” yangi yaratilgan ob'ektlarning nusxalariga (masalan, new operatori orqali yaratilgan ob'ektlar) va Serializable ob'ektlarning deserializatsiyasi (masalan, readResolve() orqali) ishorat qiladi.

Yuqoridagi paragrafda kalit so'zlardan biri - "asosan". Ko'p hollarda, "objektni yangi yaratish initilizatsiyada qaytib kelgandan so'ng" aniq semantikasiga doimo mos keladi. Bu kontekstda “initilizatsiyadan keyin” ob'ektimizning konstruktorlarida foydalanishga imkon beriladi. Agar sizga konstruktorlar amalga oshishidan oldin dependencylarni injection qilishingiz kerak bo'lsa, bu dependencylarni konceptorlar bajarilishidan oldin foydalanishga imkon beradi, @Configurable annotatsiyada quyidagicha aniqlash kerak:

Java
@Configurable(preConstruction = true)
Kotlin
@Configurable(preConstruction = true)

AspectJ tilining har xil turlarining semantikasi haqida qo'shimcha ma'lumotni ushbu ilovada topishingiz mumkin. AspectJ dasturlash qo'llanmasiga bog'lanish

Buning ishlashi uchun, annotatsiyalangan turlar AspectJ bog'lash vositasi orqali bog'langan bo'lishi kerak. Buni Ant yoki Maven vazifasi orqali (masalan, AspectJ Dastur muhit qo'llanmasi) kompilyatsiya paytida yoki yuklash paytida bog'lashni amalga oshirishingiz mumkin. AnnotationBeanConfigurerAspectning o'zi Spring orqali konfiguratsiya qilinishi kerak (yangi obyektlarni sozlash uchun ishlatiladigan bean zavodiga havola olish uchun). Agar siz Java asosidagi konfiguratsiyani qo'llasangiz, @EnableSpringConfiguredni har qanday @Configuration sinfga qo'shishingiz mumkin, quyidagicha:

Java
@Configuration
@EnableSpringConfigured
public class AppConfig {
}
Kotlin
@Configuration
@EnableSpringConfigured
class AppConfig {
}

Agar siz XML asosidagi konfiguratsiyani afzal ko'rsangiz, Springda context namespacei context:spring-configured elementini qulay ta'riflaydi, quyidagicha:

<context:spring-configured/>

Agar @Configurable annotatsiyalangan obyekt nusxalari aspekt konfiguratsiya qilinishidan oldin yaratilsa, bu loq quiets log jurnaliga xabar yuboradi va obyekt sozlanmaydi. Buning misoli bo'lishi mumkin, bin Spring konfiguratsiyasi ichida, domen obyektlarini Spring tomonidan initsializatsiyalash qachon yaratadi. Bunday hollarda, bean depends-on atributidan foydalansangiz, bean konfiguratsiya aspektiga bog'liq ekanligini qo'lda belgilashingiz mumkin. Quyidagi misolda depends-on atributidan qanday foydalanish ko'rsatilgan:

<bean id="myService"
        class="com.xzy.myapp.service.MyService"
        depends-on="org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect">
    <!-- ... -->
</bean>
Agar siz ish vaqtida uning semantikasidan foydalanishga ehtiyoj sezsangiz, @Configurable annotatsiyasini bean konfigurator aspekti orqali faollashtirmang. Xususan, @Configurable annotatsiyani oddiy Spring beans sifatida konteynerda ro'yxatdan o'tkazilgan beans turlari uchun ishlatmang. Bu ikki barobar initsializatsiyaga olib keladi - bir marta konteyner orqali va bir marta aspekt orqali.

@Configurable annotatsiyalangan obyektlarni modul testi

@Configurable annotatsiyasini qo'llashning asosiy maqsadlaridan biri domen obyektlarini mustaqil ravishda modul testlash imkoniyatidir. @Configurable annotatsiyasi AspectJga bog'lanmagan bo'lsa, annotationning modul testi hech qanday ta'sir ko'rsatmaydi. Siz ob'ekti ko'rsatuvchi yoki dasturlash ob'ekti bilan xossalarni sozlashingiz va odatiy tartibda ishlashni davom ettirishingiz mumkin. Agar @Configurable annotatsiyalangan turlar AspectJ tomonidan bog'langan bo'lsa ham, konteynerdan tashqaridagi obyektlar oddiy tartibda modul sinovidan o'tishi mumkin, lekin har safar @Configurable annotatsiyalangan ob'ekt yaratilganda, u Spring tomonidan sozlanmaganligini ko'rsatadigan ogohlantiruvchi xabarni ko'rasiz.

Bir nechta ilova kontekstlari bilan ishlash

@Configurableni qo'llab-quvvatlashni amalga oshirish uchun ishlatiladigan AnnotationBeanConfigurerAspect - bu AspectJning singleton aspekt nusxasi. Aspect nusxasi singleton doirasi static a'zolarning doirasiga o'xshaydi: Har bir klass yuklagich uchun nusxa bor. Demak, bir xil yuklagich yig'ilishidagi bir nechta ilova kontekstlarini belgilasangiz, @EnableSpringConfigured annotatsiyali beanni qaerda aniqlash va spring-aspects.jarni klass yo'lida qaerda joylashtirish haqida o'ylab ko'rishingiz kerak.

Spring web ilovasining odatdagi konfiguratsiyasini, umumiy ilova konteksti bilan birgalikda ko'rib chiqing, u umumiy ish xizmatlarini, ushbu xizmatlarni qo'llab-quvvatlash uchun zarur bo'lgan hamma narsani aniqlaydi va har bir servlet uchun bir xil ilova konteksti, lekin servletga xos bo'lgan ta'riflarning har biriga ega. Ushbu kontekstlarning barchasi bir xil yuklagich yig'ilishida mavjud bo'ladi va shuning uchun AnnotationBeanConfigurerAspectni ulardan faqat bittasida saqlash mumkin. Bunday hollarda, @EnableSpringConfigured beanini umumiy (bosh) ilova kontekstida aniqlash tavsiya etiladi. Shunday qilib, siz ehtimol domen obyektlariga kiritishni xohlaydigan xizmatlarni aniqlaysiz. Buning natijasi shundaki, domen obyektlarini servlet-ga xos bo'lgan (child) kontekstlarda aniqlangan beansga bog'liqliklar bilan @Configurable annotatsiya mexanizmini ishlatib sozlash mumkin emas (balki buni istamasangiz ham kerak).

Agar bir konteynerda bir nechta web ilovalarni joylashtirmoqchi bo'lsangiz, har bir web ilova spring-aspects.jardan faqat o'z yuklagich yordamida yuklanayotganiga ishonch hosil qiling (masalan, WEB-INF/libga spring-aspects.jarni joylashtirish orqali). Agar spring-aspects.jar faqat umumiy konteyner darajasidagi classpathga qo'shilsa (va shuning uchun umumiy ota-ona yuklagich yordamida yuklansa), barcha web ilovalar bir xil aspekt nusxasidan foydalanadi (ehtimol, bu sizga kerak emasku).

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION