Çox vaxt proxy-lərlə bağlı bir çox bənzər təriflərin olduğu vəziyyətlərlə rastlaşmaq mümkündür, xüsusilə transaction proxy tərifləri qurularkən. Əgər parent və child bean təriflərindən, həmçinin daxili bean təriflərindən istifadə etsək, daha təmiz və yığcam proxy tərifləri əldə edə bilərik.
Əvvəlcə aşağıda göstərildiyi kimi proxy üçün parent, şablon bean tərifi 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 bean-in özü heç vaxt yaradılmır, buna görə də natamam ola bilər. Daha sonra yaradılmalı olan hər bir proxy, daxili bean tərifi kimi proxy məqsədini əhatə edən child bean tərifi olacaq, çünki məqsəd heç vaxt tək başına istifadə edilmir. Aşağıdakı nümunədə belə bir child bean göstərilib:
<bean id="myService" parent="txProxyTemplate">
<property name="target">
<bean class="org.springframework.samples.MyServiceImpl">
</bean>
</property>
</bean>
Parent şablonun xüsusiyyətlərini yenidən təyin edə bilərsiniz. Aşağıdakı nümunədə biz transaction yayılma parametrlərini yenidən təyin 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>
Parent bean nümunəsində diqqət yetirin ki, biz "abstract" atributunu true olaraq təyin edərək parent bean tərifini açıq şəkildə abstrakt kimi işarələmişik, onun nümunəsinin faktiki olaraq heç vaxt yaradılmaması üçün. Application context-lər (lakin sadə bean fabrikləri deyil) varsayılan olaraq bütün singleton nümunələri əvvəlcədən yaradır. Buna görə də vacibdir (ən azı singleton bean-lər üçün), əgər siz yalnız şablon olaraq istifadə etməyi planladığınız bir bean tərifi (parent) yaratmısınızsa və bu tərif bir sinif müəyyən edirsə, abstract atributunun true olaraq təyin edildiyindən əmin olmalısınız. Əks halda, application context əslində onun nümunəsini əvvəlcədən yaratmağa çalışacaq.
ProxyFactory ilə Proqram Vasitəsilə AOP Proxy Yaratmaq
Spring vasitəsilə proqram səviyyəsində AOP proxy yaratmaq çox asandır. Bu sizə Spring AOP modulundan Spring IoC moduluna bağlı olmadan istifadə etməyə imkan verəcək.
Hədəf obyekt tərəfindən həyata keçirilən interfeyslər avtomatik olaraq proxy olunur. Aşağıdakı listinqdə bir interceptordan və bir məsləhətçidən ibarət hədəf obyekt üçün proxy yaradılması nümayiş etdirilib:
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ə obyekt yaratmaqdır. Onu hədəf obyekt ilə, əvvəlki nümunədə olduğu kimi, və ya proxy olunacaq interfeysləri göstərərək alternativ konstruktor vasitəsilə yaratmaq olar.
Məsləhətlər (interceptorlar kimi xüsusi məsləhət növləri), məsləhətçilər və ya ikisini də əlavə etmək və onlarla ProxyFactory-nin bütün həyatı boyunca manipulyasiya etmək mümkündür. Əgər IntroductionInterceptionAroundAdvisor əlavə etsəniz, proxy zorla əlavə interfeysləri həyata keçirməkdən məsul olacaq.
ProxyFactory-də həmçinin digər məsləhət növlərini əlavə etməyə imkan verən (məsələn, "öncə" məsləhəti və "istisna yaradılması" məsləhəti kimi) rahat metodlar var ki, bunlar AdvisedSupport-dən irsən alınmışdır. AdvisedSupport, ProxyFactory və ProxyFactoryBean-in superklassıdır.
GO TO FULL VERSION