Аспект и инициализация
Я хотел бы использовать инициализацию с аспектом.
@Aspect
public class TotoAspect
{
@Before("initialization( *.new(..))")
public void test(JoinPoint thisJoinPoint) throws AuditReactiveException
{
System.err.println("I AM HERE");
}
}
Но сообщение не было напечатано с
new ABC();
Я использую Java-агент для aspectj.
Где ошибка?
1 ответ
Ну, на самом деле на вашей консоли вы должны увидеть что-то вроде этого:
Exception in thread "main" org.aspectj.lang.NoAspectBoundException: Exception while initializing de.scrum_master.aspect.TotoAspect: org.aspectj.lang.NoAspectBoundException: de.scrum_master.aspect.TotoAspect
at de.scrum_master.aspect.TotoAspect.aspectOf(TotoAspect.java:1)
at de.scrum_master.app.ABC.<init>(ABC.java:4)
at de.scrum_master.app.ABC.main(ABC.java:10)
Caused by: org.aspectj.lang.NoAspectBoundException: de.scrum_master.aspect.TotoAspect
at de.scrum_master.aspect.TotoAspect.aspectOf(TotoAspect.java:1)
at de.scrum_master.aspect.TotoAspect.<init>(TotoAspect.java:10)
at de.scrum_master.aspect.TotoAspect.ajc$postClinit(TotoAspect.java:1)
at de.scrum_master.aspect.TotoAspect.<clinit>(TotoAspect.java:1)
... 2 more
Это потому, что ваш совет нацелен на всех конструкторов, даже на собственный аспект. Вы должны исключить это. Вот пример скомпилируемого кода:
Исключительный класс:
Это должно продемонстрировать, что ваш pointcut также соответствует конструктору исключения.
package de.scrum_master.app;
public class AuditReactiveException extends Exception {
public AuditReactiveException(String message) {
super(message);
}
}
Пример класса драйвера с методом main:
package de.scrum_master.app;
public class ABC {
public ABC() throws AuditReactiveException {
System.err.println("Creating ABC object");
throw new AuditReactiveException("Something went wrong");
}
public static void main(String[] args) throws AuditReactiveException {
new ABC();
}
}
Аспект с измененным pointcut:
package de.scrum_master.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import de.scrum_master.app.AuditReactiveException;
@Aspect
public class TotoAspect {
@Before("initialization(*.new(..)) && !within(TotoAspect)")
public void test(JoinPoint thisJoinPoint) throws AuditReactiveException {
System.err.println(thisJoinPoint);
}
}
Образец вывода:
initialization(de.scrum_master.app.ABC())
Creating ABC object
initialization(de.scrum_master.app.AuditReactiveException(String))
Exception in thread "main" de.scrum_master.app.AuditReactiveException: Something went wrong
at de.scrum_master.app.ABC.<init>(ABC.java:6)
at de.scrum_master.app.ABC.main(ABC.java:10)
Вы также можете захотеть исключить конструктор исключений, т.е. вам следует сузить область действия pointcut с помощью имен пакетов и / или классов. Ознакомьтесь с документацией AspectJ для описания синтаксиса pointcut, например, как использовать такие джокеры, как *
или же ..
,