Возможен ли весной мелкозернистый контроль aspectj-autoproxy?
Вопрос
Если я просто добавлю <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.
Так что теперь у меня есть только два проксируемых класса ;)