Может кто-нибудь объяснить ProxyFactoryBean простыми словами? Я вижу, что это цитируется много мест.
ProxyFactoryBean в Spring
Ответ 1
ProxyFactoryBean
используется для применения логики перехватчика к существующей целевой bean, поэтому, когда вызываются методы в этом bean, перехватчики выполняются до и после вызова этого метода. Это пример аспектно-ориентированного программирования (АОП).
Это лучше всего объяснить с помощью простого примера. Классическим вариантом использования AOP является применение кэширования к результату вызова метода. Это можно подключить с помощью ProxyFactoryBean
следующим образом:
<bean id="targetService" class="com.x.MyClass"/>
<bean id="cachingInterceptor" class="com.x.MyCachingInterceptor"/>
<bean id="cachedService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="targetService"/>
<property name="interfaces">
<list>
<value>com.x.MyService</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>cachingInterceptor</value>
</list>
</property>
</bean>
У нас есть bean targetService
типа com.x.MyClass
, который реализует интерфейс com.x.MyService
. У нас также есть перехватчик bean, называемый cachingInterceptor
, который реализует интерфейс org.aopalliance.intercept.MethodInterceptor
.
В этой конфигурации будет создан новый bean, называемый cachedService
, который реализует интерфейс MyService
. Любые вызовы методов на этом объекте сначала передаются через метод cachingInterceptor
object invoke()
, который в этом случае будет искать результаты предыдущих вызовов метода во внутреннем кеше. Он либо вернул бы кешированный результат, либо разрешил вызов метода перейти к соответствующему методу на targetService
.
targetService
сам ничего не знает об этом, он полностью не осознает все эти события АОП.
ProxyFactoryBean
сильно используется внутри Spring для создания прокси-серверов по различным причинам (например, удалению заглушек, управлению транзакциями), но он отлично подходит для использования в логике приложений.
Ответ 2
ProxyFactoryBean применяет аспекты к существующему bean. Вы начинаете с существующего bean (целевой bean), который spring "обертывает", чтобы добавить предоставленные вами аспекты. Возвращенный bean имеет тот же интерфейс, что и исходный bean, но с дополнительными аспектами, сотканными вокруг целевых методов bean.