如何使用Guice将成员注释注入我当前的实例化对象?

时间:2016-08-18 20:50:36

标签: java dependency-injection annotations guice

我正在尝试使用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();
  }
}

2 个答案:

答案 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。