我正在尝试使用Guice https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/BidiMap.html
将自定义注释注入到我当前实例化的Service.java类中。不幸的是,当我致电bindInterceptor
时,未调用myMethod()
方法。当OnAnnotationEvent::invoke
注释标记用于当前类中的方法时,如何使用Guice调用OnAnnotationEvent::invoke
?
我的代码如下所示:
Service.java
@OnAnnotation
DataAccessModule.java
//Instantiated by another service
public class Service extends AbstractVerticle {
private DataAccess dataAccess;
@Inject
public void setDataAccess(DataAccess dataAccess){
this.dataAccess = dataAccess;
}
@Override
public void start() throws Exception {
Guice.createInjector(new DataAccessModule()).injectMembers(this);
myMethod();
}
@MyAnnotation
public void myMethod() {
dataAccess.doStuff();
}
}
OnAnnotationEvent
public class DataAccessModule extends AbstractModule {
@Override
protected void configure() {
OnAnnotationEvent onAnnotationEvent = new OnAnnotationEvent();
bindInterceptor(Matchers.any(), Matchers.annotatedWith(MyAnnotation.class), onAnnotationEvent);
bind(DataAcess.class).to(DataAccessImpl.class);
}
}
MyAnnotation
public class OnAnnotationEvent implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println("Annotation called on: " + invocation.getMethod().getName();
return invocation.proceed();
}
}
答案 0 :(得分:0)
我认为您的问题是您创建的新注射器对您的课程一无所知。如果您只需要班级中的注射器 - 请使用@Inject private Injector injector;
。如果您需要在本地加载一些aditional模块,您只需要创建子注入器:
@Inject private baseInjector;
...
injector = baseInjector.createChildInjector(new Module1(),new Moddule2());
答案 1 :(得分:0)
这不起作用,因为您的Service实例不是由Guice管理的。要使其工作,您必须使用Guice创建Service或使用MyAnnotation在DataAccessImpl中创建注释方法doStuff。