Может ли кто-нибудь объяснить ProxyFactoryBean простыми словами? Я вижу, это цитируется во многих местах.
ProxyFactoryBean
используется для применения логики перехватчика к существующему целевому компоненту, чтобы при вызове методов этого компонента перехватчики выполнялись до и после вызова этого метода. Это пример аспектно-ориентированного программирования (АОП).
Лучше всего это пояснить на простом примере. Классическим вариантом использования АОП является применение кеширования к результату вызова метода. Это можно подключить с помощью 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
. У нас также есть компонент-перехватчик cachingInterceptor
, который реализует интерфейс org.aopalliance.intercept.MethodInterceptor
.
Эта конфигурация сгенерирует новый bean-компонент с именем cachedService
, который реализует интерфейс MyService
. Любые вызовы методов этого объекта сначала будут передаваться через метод invoke ()
объекта cachingInterceptor
, который в этом случае будет искать результаты предыдущих вызовов методов во внутреннем кэше. . Он либо вернет кешированный результат, либо позволит вызову метода перейти к подходящему методу на targetService
. Сам
targetService
ничего об этом не знает, он совершенно не знает, что происходит вокруг АОП.
ProxyFactoryBean
активно используется внутри Spring для создания прокси по разным причинам (например,удаленные заглушки, управление транзакциями), но он также отлично подходит для использования в логике приложения.
ProxyFactoryBean применяет аспекты к существующему компоненту. Вы начинаете с существующего bean-компонента (целевого bean-компонента), который пружиной «обертывает», чтобы добавить предоставляемые вами аспекты. Возвращенный bean-компонент имеет тот же интерфейс, что и ваш исходный bean-компонент, но с дополнительными аспектами, связанными с методами целевого bean-компонента.