Tez-tez tranzaksiya proxyləri müəyyən edərkən çox sayda oxşar proxy tərifləri ilə qarşılaşmaq olar. Əgər siz övlad binaların və daxili binaların təriflərindən istifadə etsəniz, daha təmiz və qısa proxy təriflərini əldə edə biləcəksiniz.
Əvvəlcə parent, nümunə binalara proxy üçün belə bir tərif yaradırıq:
<bean id="txProxyTemplate" abstract="true"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
Bu nümunə öz-özünə heç vaxt yaradılmır, bu səbəbdən natamam ola bilər. Belə sonra yaranmasına ehtiyac olan hər proxy, target proxy-nin daxili müəyyən olunması kimi bir övlad bina olacaq, çünki target özü heç vaxt istifadə edilmir. Aşağıdakı nümunədə belə bir övlad bina göstərilib:
<bean id="myService" parent="txProxyTemplate">
<property name="target">
<bean class="org.springframework.samples.MyServiceImpl">
</bean>
</property>
</bean>
Parent şablonun xassələrini yenidən müəyyən edə bilərsiniz. Aşağıdakı nümunədə biz tranzaksiya yayılma parametrlərini yenidən müəyyən edirik:
<bean id="mySpecialService" parent="txProxyTemplate">
<property name="target">
<bean class="org.springframework.samples.MySpecialServiceImpl">
</bean>
</property>
<property name="transactionAttributes">
<props>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="store*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
Qeyd edək ki, parent binanın nümunəsində biz parent binanı açıq şəkildə abstrakt olaraq qeyd etmişik, abstract
atributunu true
edən halda, bununla onun nümunəsinin heç vaxt yaradılmamasını təmin etmişik. Application context-lər (amma adi bina fabrikləri deyil) adətən bütün tək nümunələri öncədən yaradırlar. Buna görə də, əgər sizdə bir bina müəyyən edilməsi (parent) varsa və bunu şablon kimi istifadə etməyi düşünürsünüzsə, və bu təyin etdiyi bir sinif varsa, siz abstract
atributunun true
olaraq təyin edildiyindən əmin olmalısınız. Əks halda, application context həqiqətən onun nümunəsini öncədən yaratmağa çalışacaq.
ProxyFactory ilə proqram vasitəsilə AOP proxy yaratmaq
Spring ilə proqram vasitəsilə AOP proxy yaratmaq çox asandır. Bu, Spring AOP modulu ilə Spring IoC modulundan asılı olmayan bir şəkildə işləməyə imkan verəcək.
Target obyektin həyata keçirdiyi interfeyslər avtomatik olaraq proksiyalanır. Aşağıdakı listin target objekti üçün bir interceptor və bir advisor ilə proxy yaratmağı göstərir:
ProxyFactory factory = new ProxyFactory(myBusinessInterfaceImpl);
factory.addAdvice(myMethodInterceptor);
factory.addAdvisor(myAdvisor);
MyBusinessInterface tb = (MyBusinessInterface) factory.getProxy();
val factory = ProxyFactory(myBusinessInterfaceImpl)
factory.addAdvice(myMethodInterceptor)
factory.addAdvisor(myAdvisor)
val tb = factory.proxy as MyBusinessInterface
İlk addım org.springframework.aop.framework.ProxyFactory
tipində bir obyekt yaradır. Onu, əvvəlki nümunədə olduğu kimi target obyekt ilə yaratmaq olar və ya proxy olunacaq interfeysləri alternativ bir constructor-da göstərmək olar.
Siz Advice-lər (Interceptor-lar kimi xüsusi bir növ Advice olaraq), Advisor-lar və ya hər ikisini əlavə edə bilərsiniz və ProxyFactory
-nin həyat dövrü boyu onları manipulyasiya edə bilərsiniz. Əgər IntroductionInterceptionAroundAdvisor
əlavə etsəniz, proxy zorla əlavə interfeysləri də həyata keçirə bilər.
ProxyFactory
-də həmçinin AdvisedSupport
-dan miras alınan rahat metodlar var ki, müxtəlif növ Advice-ləri əlavə etməyə imkan verir, məsələn, "öncə" Advice və "istisna atma" Advice-ləri. AdvisedSupport
ProxyFactory
və ProxyFactoryBean
siniflərinin super sinifidir.
GO TO FULL VERSION