Возможен ли весной мелкозернистый контроль aspectj-autoproxy?

StackOverflow https://stackoverflow.com/questions/803942

  •  03-07-2019
  •  | 
  •  

Вопрос

Если я просто добавлю <aop:aspectj-autoproxy proxy-target-class="false" /> в начало моего контекста spring, каждый отдельный компонент, реализующий интерфейс, получит прокси-сервер JDK.Я бы действительно хотел ограничить прокси А) классами, которым действительно нужны прокси, или Б) классами, которые я указываю как нуждающиеся в прокси.

Я попытался использовать строку aop: scoped-proxy в определении xml-компонента для компонентов, которым нужны прокси, но, похоже, это не дает мне советов по aop.

Я также попытался добавить <aop:aspectj-autoproxy ....=""> ближе к концу моего XML-файла spring, но перед добавлением всех компонентов, которым нужны прокси, но, похоже, это не работает должным образом.

У меня есть лот из бобов с интерфейсами, но только (четко определенная) горстка нуждается в советах AoP, и эти прокси сильно портят мои трассировки стеков.(Я заглянул в spring 3.0 и подозреваю, что там это будет возможно, но, похоже, до этого еще какое-то время).

Возможно ли это в 2.5.X?

Это было полезно?

Решение

Как видно из AbstractAdvisorAutoProxyCreator.java строки 67 (Spring 2.5.6), autoproxy creator действительно делает только то, о чем я его прошу.Он не выполняет автопроксимацию больше, чем считает необходимым.

Оказывается, именно то выражение pointcut, которое вы используете, сильно влияет на то, насколько эффективно выполняется проксирование этого класса;аннотация, которую я использовал, была

@Around(value="@target(myannotation)")

По сути, это означает, что spring генерирует прокси, который принимает решение о перехвате на основе типа фактической цели вызова.Недостатком этого является то, что spring пытается сделать это с помощью ВСЕ доступные компоненты в applicationcontext.Если бы вместо этого я использовал что-то вроде @within, spring использовала бы интерфейс, чтобы решить, следует ли выполнять автоматическую проверку, и это можно статически определить во время создания applicationcontext.

Так что теперь у меня есть только два проксируемых класса ;)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top