У меня есть аспект, определяемый следующим образом:
@Component
@Aspect
public class SomeAspectDefinition {
@Pointcut("execution(* *(..)) && bean(someBeanAlias)")
private void pnct() {
}
@Around("pnct()")
public Object aroundPnct(ProceedingJoinPoinbt pjp) throws Throwable {
return pjp.proceed();
}
}
и в файле контекста:
<aop:aspectj-autoproxy />
Однако someBeanAlias
не может быть разрешен, и, следовательно, прокси не создается для bean- someBeanAlias
за псевдонимомBeanAlias.
Я проверил код, и это происходит из-за отсутствия beanFactory
в org.springframework.aop.aspectj.AspectJExpressionPointcut.BeanNameContextMatcher.matchesBeanName
. Кажется, что эта фабрика устанавливается только через интерфейс BeanFactoryAware
который не используется, когда pointcut создается вручную в org.springframework.aop.aspectj.annotation.AbstractAspectJAdvisorFactory.createPointcutExpression(Method, Class, String[])
.
Я что-то упустил или это ошибка?
Я использую spring 3.2.5
Я протестировал ваш сценарий и даже не весной 2.5.3 (исправлена версия SPR-4601), он не работает с стилем @AspectJ.
С другой стороны, он работает в xml (все версии от 2.5.3 до 4.0.4):
<aop:config>
<aop:aspect ref="aliasAdvice">
<aop:pointcut id="pnct"
expression="execution(* *(..)) && bean(someBeanAlias)" />
<aop:around method="around" pointcut-ref="pnct" />
</aop:aspect>
</aop:config>
На данный момент, если возможно, вы можете использовать xml-подход. И новая проблема JIRA против весны, я думаю, не повредит.
Я не пользователь Spring, но быстрый поиск показывает мне, что эта проблема должна была быть исправлена с 2.5.3. Возможно, вы хотите прокомментировать или снова открыть билет или создать новый, указывающий на старый: