方面未被调用

时间:2017-07-15 19:17:30

标签: java aop aspectj aspect

我有一个简单的aspect,它应该设置类fied的值,它有注释@GuiceInject

原来我有这个

@GuiceInject(module=RepositoryModule.class)
private IRacesRepository repository;

我希望与此相似

private IRacesRepository repository = GuiceInject.getInstance(IRacesRepository.class);

这是我的方面

public aspect InjectionAspect {

    Object around(): get(@GuiceInject * *) {
        System.out.println(thisJoinPointStaticPart);
        // instantiate object as it supposed to be null originally
        return GuiceInjector.getInstance(thisJoinPoint.getTarget().getClass());
    }
}

据我了解 - 我是AOP的新手 - 它应该用方面代码替换get字段的调用。

编译很好,但是当我运行应用程序时 - 没有任何反应。对于NullPointerException方法,我得到readRaces,因为它保持null,因此aspect无效。

我的main课程看起来像这样

public class Example {
    @GuiceInject(module=RepositoryModule.class)
    private IRacesRepository racesRepository;

    private void execute() {
        System.out.println("List of races: " + racesRepository.readRaces());
    }

    public static void main(String[] args) {
        new Example().execute();
    }
}

有什么问题?注释具有此定义

@Target(ElementType.FIELD)
// make annotation visible in runtime for AspectJ
@Retention(RetentionPolicy.RUNTIME)
public @interface GuiceInject {
    Class<? extends AbstractModule> module();
}

1 个答案:

答案 0 :(得分:1)

请尝试将切入点语法重新定义为

Object around(): get(@package.subpackage.GuiceInject * *.*) 

正确的字段签名必须指定字段的类型,声明类型和名称。如果您的注释位于不同的包中,则应该完全限定。