2011-12-07 4 views
1

나는 두 개의 Runnable 클래스를 가지고 있는데 이 FirstProcedure으로 생성 된 Table을 사용하여 실행되도록 이들 사이에 종속성을 주입하려고합니다.주석을 사용하는 Guice 메소드 주입

class FirstProcedure implements Runnable { 
    private Table composers = new Table(); 

    public void run() { 
     // populates the composers table 
    } 

    public Table getComposers() { 
     return composers; 
    } 
} 


class SecondProcedure implements Runnable { 
    private Table composers; 

    public void run() { 
     // writes the name of each composer to the console 
    } 

    public Table setComposers(final Table composers) { 
     this.composers = composers; 
    } 
} 

생각은 내 메인 클래스에 내가 (이이 점에 의해 채워지지 않습니다에도 불구하고 제대로 참조해야합니다) 관련 테이블을 주입, 절차 모두의 인스턴스 사이의 종속성을 해결할 수 있다는 것입니다 두 절차를 수행 한 다음 올바른 순서로 실행하십시오. 즉,이 두 절차의 각각에 대해 고유 한 인스턴스가 있습니다 (그러나 적절한 단위 테스트를 가질 수 있도록 의도적으로 Singleton (anti) 패턴을 피하고 있습니다).

어떻게 Guice를 사용하여이 문제를 해결할 수 있습니까? 나는 같은과 setComposers 방법에 주석을 달 수 :

@InjectTable(procedure=FirstProcedure.class, name="composers") 
public Table setComposers(final Table composers) { 
    this.composers = composers; 
} 

및 제공된 필드의 클래스와 이름을 기준으로 SecondProcedureTable을 결합하는 Guice 모듈이?

bind() 방법에이 패러다임에 맞는 내용이 표시되지 않습니다. AbstractModule입니다.

(이것을 제외하고, 나는 필드가 문자열에있는 대신 명시 적으로 어떻게 든 방법을 참조하는 이름으로,이 주석 자체에 대한 디자인에 너무 치열하지 않다.)

답변

0

나는 생각한다 문제가 지나치게 복잡해질 수 있습니다.

class SecondProcedure { 
    @Inject 
    SecondProcedure(Table table) { 
    this.table = table; 
    } 
} 

그리고 FirstProcedure 표의 공급자이다 : SecondProcedure 표에 간단한 종속성이 같은

같습니다

class FirstProcedure implements Provider<Table> { 
    public Table get() { 
    return buildTheTable(); 
    } 
} 
모듈 후 바로 제공 바인딩 할 필요가

:

class SomeModule extends AbstractModule { 
    protected void configure() { 
    bind(Table.class).toProvider(FirstProcedure.class); 
    } 
} 

@Inject 주석 처리 된 생성자의 JIT 바인딩은 SecondProcedure를 제공하므로 명시 적으로 바인딩 할 필요가 없습니다.

이 작업을 완료하면 FirstProcedure의 이름을 TableProvider로 변경하는 것이 좋습니다. 그것의 같은 반 패턴이없는 여담으로

injector.getInstance(FirstProcedure.class).run(); 

(범위 @Singleton)을 Guice 싱글 톤 패턴 :

는 다음 그냥 주입, 또는 인젝터에서 그것을 얻을의 FirstProcedure을 사용하려면 인젝터에 국한된다. 적절한 경우가 많으며 Guice 싱글 톤 구현은 테스트 방법으로 사용되지 않습니다.

아마 당신이 걱정해야 할 것은 정적 상태입니다. Guice 자체가 왜 나쁜지에 대한 좋은 설명을 제공합니다. http://code.google.com/p/google-guice/wiki/AvoidStaticState

관련 문제