Components

 

. 모듈과 주입간의 다리 역할 = injector

. @Component 주석과 연관된 모듈들을 줄줄이 기록해둔다

@Singleton
@Component(modules = {
        NetworkModule.class,
        TwitterModule.class,
})
 
public interface TwitterComponent {
    Tweeter tweeter();
    Timeline timeline();
}
 
TwitterComponent component = Dagger_TwitterComponent.builder()
        .networkModule(new NetworkModule())
        .twitterModule(new TwitterModule("JakeWarton"))
        .build();
 
Tweeter tweeter = component.tweeter();
tweeter.tweet("asdasdasd");
 
Timeline timeline = component.timeline();
timeline.loadMore(20);
for(Tweet tweet : timeline.get()){
    System.out.println(tweet);
}
 

연관된 모듈들을 @Component 뒤에 기록해두었다. 

모듈이 제공하는 인스턴스들이 모두 싱글톤이었으므로, TwitterComponent도 싱글톤으로 지정했다.

 

인터페이스를 구성한 이 후, Dagger에서 제공하는 build()함수를 콜해서 컴포넌트들 만들 수 있다.

이 후 이 컴포넌트만 가지고 인스턴스를 가져올 수 있다.

 

사실 NetworkModule은 기본생성자를 가지고 있기 때문에 컴포넌트 생성코드에 네트워크 모듈은 부르지 않아도 되긴하다.

 

public class TwitterApplicatopn implements Runnable {
    private final Tweeter tweeter;
    private final Timeline timeline;
 
    @Inject
    public TwitterApplicatopn(Tweeter tweeter, Timeline timeline){
        this.tweeter = tweeter;
        this.timeline = timeline;
    }
 
    @Override
    public void run(){
        tweeter.tweet("asdasdasd");
 
        timeline.loadMore(20);
        for(Tweet tweet : timeline.get()){
            System.out.println(tweet);
        }
    }
}
 
@Singleton
@Component(modules = {
        NetworkModule.class,
        TwitterModule.class,
})
 
public interface TwitterComponent {
    TwitterApplicatopn app();
}
 
TwitterComponent component = Dagger_TwitterComponent.builder()
        .networkModule(new NetworkModule())
        .twitterModule(new TwitterModule("JakeWarton"))
        .build();
 

아니면 TwitterApplication 이라는 싱글 엔트리 포인트를 만들어 두었기 때문에, 이를 스레드화시키고 run()만 해서 작동시키는게 더 보편적인 개발패턴이란다.

 

 

 

 

 

 

 

+ Recent posts