Aspectj和初始化

时间:2014-05-15 16:28:04

标签: java aspectj

我想使用aspectj进行初始化。

@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 个答案:

答案 0 :(得分:7)

嗯,实际上在你的控制台上你应该看到这样的东西:

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

这是因为你的建议是针对所有构造函数,甚至是它自己的方面。你需要排除它。这是一个可编译的代码示例:

异常类:

这是为了证明你的切入点也匹配异常的构造函数。

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();
    }
}

修改了切入点的方面:

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)

您可能还想排除异常构造函数,即您应该使用包和/或类名缩小切入点的范围。查看AspectJ文档中的切入点语法描述,例如:如何使用*..等笑话。