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

时间:2011-03-23 16:00:49

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

有没有办法在Guice的帮助下获取transactionInterceptor,还是需要手动创建拦截器所需的所有对象?

2 个答案:

答案 0 :(得分: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);
  }
}

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

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

答案 1 :(得分:1)

看看Guice Persist是如何写的。具体来说,JpaPersistService及其模块。