У меня есть внешний файл jar, который находится внутри только одного класса AspectJ.
@Aspect
public class SecurityAspect {
@Pointcut("execution(* *(..)) && @annotation(external.package.Secure)")
public void doCheck() {}
@Before("doCheck()")
public void applyCheck(JoinPoint joinPoint) {
//sth...
}
}
Я хочу запустить этот аспект, используя аннотацию @Secure в контроллере Spring MVC
@Secure
@RequestMapping(value = "/test", method = RequestMethod.GET)
public void test() {
System.out.println("test");
}
В aspects-config.xml есть все необходимое для рассмотрения аспектов моего проекта.
<aop:aspectj-autoproxy>
<aop:include name = "log" /> (non external)
<aop:include name = "sec" />
</aop:aspectj-autoproxy>
<bean id = "log"
class = "internal.package.LogAspect"
factory-method = "aspectOf" />
<bean id = "sec"
class = "external.package.SecurityAspect"
factory-method = "aspectOf" />
Eclipse распознает, что что-то привязано к test(), но когда я запускаю сервер, Spring не может найти класс external.package.SecurityAspect
Caused by: java.lang.ClassNotFoundException: external.package.SecurityAspect
В моем приложении у меня уже есть не внешний аспект, который ведет журнал для утилиты, и перемещение аспекта безопасности в пакет проекта работает нормально.
Наиболее полные (для меня) вопросы, с которыми я столкнулся:
это (1), но я не уверен, что это полностью правильно, поскольку Eclipse распознает это также во внешнем Jar ... но, возможно, это мое недоразумение;
это (2) В этом есть смысл! Я удалил свою внешнюю библиотеку из maven, удалил все указатели на application-context.xml (верно?), Импортированные этим интерфейсом, запуском и ... Error creating bean with name 'log' defined in file [path/to/aspects-config.xml]: No matching factory method found: factory method 'aspectOf()'. Check that a method with the specified name exists and that it is static. (почему жалуется на аспект log?)
это (3) говорит о <context:load-time-weaver />, но, похоже, не работает после добавления в контекст моего приложения xml.
Эта проблема возникает только в том случае, если я использую EXTERNAL JAR не в том же пакете.
Может ли кто-нибудь лучше прояснить, действительно ли это невозможно (это (3)) или возможно сделать внешний аспект для импорта в проекты в качестве сторонней библиотеки?
Не ожидал, что именно это действительно решило мою проблему (невероятное О_О) ты классный, спасибо




М. Дейнум в комментариях ниже заметил, что использование factory-method = "aspectOf" не обязательно с типами, отличными от aspect (тогда для всех моих @Aspect это не так).
Убрал то, автозагрузку, никаких исключений и теперь у меня рабочий аспект.
aspectOfследует использовать для аспектов, написанных в традиционном синтаксисе AspectJ (типaspect). С аннотированным классом@Aspectвам не следует использовать фабричный метод, а просто создать экземпляр bean-компонента.