Досі ми розглядали явне створення проксі АОП за допомогою ProxyFactoryBean
або аналогічного біна-фабрики.
Spring також дозволяє використовувати визначення бінів з "автопроксі", які можуть автоматично проксувати вибрані визначення бінів. Цей принцип побудований на інфраструктурі постпроцесора бінів Spring, яка дозволяє модифікувати будь-яке визначення біна в міру завантаження контейнера.
У цій моделі ти встановлюєш певні специфічні визначення бінів у XML-файлі визначення бина для конфігурування інфраструктури автопроксі. Це дозволяє оголошувати цілі, які підходять для автопроксіювання. Немає необхідності використовувати ProxyFactoryBean
.
Зробити це можна двома способами:
-
За допомогою автора автопроксі, який посилається на специфічні біни в поточному контексті.
-
Особливий випадок створення автопроксі, який заслуговує на окремий розгляд: створення автопроксі на основі атрибутів метаданих на рівні джерела.
Визначення бінів з автопроксі
У цьому розділі розглядаються автори автопроксі, які надаються пакетом org.springframework.aop.framework.autoproxy
.
BeanNameAutoProxyCreator
Клас BeanNameAutoProxyCreator
— це BeanPostProcessor
, який автоматично створює проксі АОП для бінів з іменами, що відповідають літерним значенням або знакам підстановки. У наступному прикладі показано, як створити бін BeanNameAutoProxyCreator
:
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames" value="jdk*,onlyJdk"/>
<property name="interceptorNames">
<list>
<value>myInterceptor</value>
</list>
</property>
</bean>
Як і в ProxyFactoryBean
, тут є властивість interceptorNames
, а не список перехоплювачів для забезпечення коректної логіки роботи радників-прототипів. Іменовані "перехоплювачі" можуть бути радниками або порадами будь-якого типу.
Як і у випадку автопроксування в цілому, основний сенс використання BeanNameAutoProxyCreator
полягає в послідовному застосуванні однієї і тієї ж конфігурації до кількох об'єктів при мінімальній конфігурації. Це найпопулярніший спосіб застосування декларативних транзакцій до кількох об'єктів.
Визначення бінів, імена яких збігаються, такі як jdkMyBean
та onlyJdk
у попередньому прикладі, є звичайними визначеннями бінів з цільовим класом. Проксі АОП автоматично створюється за допомогою BeanNameAutoProxyCreator
. Цю ж пораду застосуємо до всіх відповідних бінів. Зверни увагу: якщо використовуються радники (а не перехоплювач у попередньому прикладі), зрізи можна по-різному застосовувати до різних бінів.
DefaultAdvisorAutoProxyCreator
Найбільш загальним, але надзвичайно ефективним творцем автопроксі є DefaultAdvisorAutoProxyCreator
. Він автоматично застосовує відповідні радники у поточному контексті, без необхідності включати конкретні імена бінів до визначення біна радника з автопроксі. Він пропонує ті ж переваги послідовної конфігурації та уникнення дублювання, що і BeanNameAutoProxyCreator
.
Використання цього механізму включає:
-
Встановлення визначення біна
DefaultAdvisorAutoProxyCreator
. -
Встановлення будь-якої кількості радників в тому самому або суміжних контекстах. Зверни увагу, що це мають бути радники, а не перехоплювачі чи інші поради. Це необхідно, тому що має існувати обрізаний зріз, щоб перевіряти відповідність кожної ради визначенням бінів-кандидатів.
DefaultAdvisorAutoProxyCreator
автоматично обчислює зріз, що міститься в кожному раднику, щоб дізнатися, яку пораду (якщо така є) він повинен застосувати до кожного бізнес-об'єкта (наприклад, businessObject1
та businessObject2
у прикладі).
Це означає, що будь-яка кількість радників може бути автоматично застосована до кожного бізнес-об'єкта. Якщо жоден з радників не збігатиметься з жодним методом бізнес-об'єкта, об'єкт не буде проксований. По мірі додавання бінів для нових бізнес-об'єктів, вони автоматично проксуються, якщо це необхідно.
Перевага автопроксування загалом полягає в тому, що воно не дозволяє коду, що робить виклики, або залежностям отримувати об'єкт, не забезпечений порадою. Виклик getBean("businessObject1")
для цього ApplicationContext
повертає проксі АОП, а не цільовий бізнес-об'єкт. (Підхід з "внутрішнім біном", показаний раніше, також надає цю перевагу).
У наступному прикладі створюється бін DefaultAdvisorAutoProxyCreator
та інші елементи, розглянуті в цьому розділі:
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>
<bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
<property name="transactionInterceptor" ref="transactionInterceptor"/>
</bean>
<bean id="customAdvisor" class="com.mycompany.MyAdvisor"/>
<bean id="businessObject1" class="com.mycompany.BusinessObject1">
<!-- Властивості опущені -->
</bean>
<bean id="businessObject2" class="com.mycompany.BusinessObject2"/>
DefaultAdvisorAutoProxyCreator
дуже корисний, якщо тобі потрібно послідовно застосовувати ту саму пораду до багатьох бізнес-об'єктів. Після створення інфраструктури можна додавати нові бізнес-об'єкти без увімкнення специфічної конфігурації проксі. Ти також можеш додати інші аспекти (наприклад, аспекти трасування або моніторингу продуктивності) з мінімальними змінами в конфігурації.
DefaultAdvisorAutoProxyCreator
пропонує підтримку фільтрації (за допомогою використання угоди про іменування, щоб обчислювалися лише певні радники, що дозволить використовувати безліч по-різному налаштованих AdvisorAutoProxyCreator в одній фабриці) та впорядкування. Радники можуть реалізовувати інтерфейс org.springframework.core.Ordered
для забезпечення належного впорядкування, якщо це проблема. TransactionAttributeSourceAdvisor
, який використовується в попередньому прикладі, має значення впорядкованості, яке налаштовується. За замовчуванням використовується значення "неупорядкований".