我可以在Guice的Module.configure()中使用已绑定的实例吗?

Lór*_*tér 2 java dependency-injection guice

我想MethodInterceptor在我的模块的configure()方法中绑定一个,如下所示:

public class DataModule implements Module {

    @Override
    public void configure(Binder binder) {
        MethodInterceptor transactionInterceptor = ...;
        binder.bindInterceptor(Matchers.any(), Matchers.annotatedWith(Transactional.class), null);
    }

    @Provides
    public DataSource dataSource() {
        JdbcDataSource dataSource = new JdbcDataSource();
        dataSource.setURL("jdbc:h2:test");
        return dataSource;
    }

    @Provides
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Provides
    public TransactionInterceptor transactionInterceptor(PlatformTransactionManager transactionManager) {
        return new TransactionInterceptor(transactionManager, new AnnotationTransactionAttributeSource());
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在transactionInterceptorGuice的帮助下获得,或者我是否需要手动创建拦截器所需的所有对象?

Jes*_*son 6

这在Guice FAQ中有所涉及.从该文件:

为了在AOP MethodInterceptor中注入依赖项,请在标准bindInterceptor()调用旁边使用requestInjection().

public class NotOnWeekendsModule extends AbstractModule {
  protected void configure() {
    MethodInterceptor interceptor = new WeekendBlocker();
    requestInjection(interceptor);
    bindInterceptor(any(), annotatedWith(NotOnWeekends.class), interceptor);
  }
}
Run Code Online (Sandbox Code Playgroud)

另一个选择是使用Binder.getProvider并在拦截器的构造函数中传递依赖项.

public class NotOnWeekendsModule extends AbstractModule {
  protected void configure() {
    bindInterceptor(any(),
                annotatedWith(NotOnWeekends.class),
                new WeekendBlocker(getProvider(Calendar.class)));
  }
}
Run Code Online (Sandbox Code Playgroud)