2011-03-23 4 views
2

MethodInterceptorMethodInterceptor와 같은 방법으로 바인딩하고 싶습니다.Guice의 Module.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를 구할 수있는 방법이 있습니까? 아니면 필요한 모든 객체를 생성해야합니까? 수동 요격 요원?

답변

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))); 
    } 
} 
관련 문제