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()만 해서 작동시키는게 더 보편적인 개발패턴이란다.