Dagger2를 알아보자 – 기본편
Dagger2를 알아보자 – Scope 
Dagger2를 알아보자 – Injection의 종류
Dagger2를 알아보자 – Qualifier 
Dagger2를 알아보자 – Binding (You’re here)
Dagger2를 알아보자 – Multibinding
Dagger2를 알아보자 – SubComponent
Dagger2를 알아보자 – Android
Dagger2를 알아보자 – Testing(준비중)
Dagger2를 알아보자 – Dynamic Feature에 적용하기


@Binds

Module내에서 abstract 메소드 앞에 붙여 바인딩을 위임하는 애노테이션입니다.  예를들어 Random이란 객체를 SecureRandom이란 객체에 바인딩 하기 위해서는 다음과 같이 선언 할 수 있습니다.

@Binds abstract Random bindRandom(SecureRandom secureRandom);

@Binds 메소드는 객체를 생성하는 대신 컴포넌트내에 있는 객체를 파라미터로 받아 바인딩함으로써 좀 더 효율적으로 동작하게 됩니다.

@BindsOptionalOf

Optional 컨테이너에 들어갈 value에 대한  바인딩을 선언하는 애노테이션입니다. 
만약 Module내에 다음과 같이 메소드가 선언되어있다고 가정해 보겠습니다.

@BindsOptionalOf abstract Foo optionalFoo();

컴포넌트 내에 있는 어떠한 객체든 이 Foo와 바인딩 될 만한 객체가 있다면 바인딩되게 됩니다. 만약 바인딩이 된다면 Optional<Foo>에 의존성 주입시 컨테이너의 상태가 Present(객체있음) 상태가 되고, 그렇지 않다면 Absent(비어있음) 상태가 됩니다.

@BindsOptionalOf 메소드는 다음과 같은 조건을 충족해야 사용가능합니다.

  • 반드시 abstract여야 함.
  • qualifier 애노테이션을 가질수 있음
  • void를 반환할 수 없음
  • 파라미터를 가질 수 없음
  • 예외처리 불가
  • @Inject가 붙은 생성자에 qualifier가 지정되지 않은 타입을 반환할 수 없음

구체적으로 아래의 경우들에 대해 인젝션이 가능하게 됩니다.

Optional<Foo>
Optional<Provider<Foo>>
Optional<Lazy<Foo>>
Optional<Provider<Lazy<Foo>>>

만약 Foo와 바인딩되는것에 @Nullable애노테이션이 있다면, 컴파일시간에 에러가 발생하게 됩니다. 왜냐하면 Optional 컨테이너는 null을 포함할 수 없기 때문입니다. 컨테이너에 Provider나 Lazy의 다른 형태로 주입하여 null이 들어가는 것을 방지하고, 필요시 get()메소드를 통해 객체 또는 null을 얻을수 있습니다.

@BindsInstance

컴포넌트 빌더내의 메소드에 추가하거나 컴포넌트 팩토리내의 파라미터로 추가하여 객체를 컴포넌트가 가지고 있는 특정 키에 바인딩 하게 됩니다.

@Component.Builder
interface Builder {
    @BindsInstance Builder foo(Foo foo);
    @BindsInstance Builder bar( @Blue Bar bar);
    ...
}

// or

@Component.Factory
interface Factory {
    MyComponent newMyComponent(
        @BindsInstance Foo foo,
        @BindsInstance @Blue Bar bar);
}

빌더나 팩토리에게 Foo와 Bar 인스턴스를 넘겨줌으로써 컴포넌트가 이 인스턴스들을 관리하게 되고 요청시 이 인스턴스들을 넘겨주게 됩니다.

@BindsInstance의 인자는 @Nullable 애노테이션이 붙지 않는 이상 null이 될수 없습니다.

빌더에서 @BindsInstance 메소드는 반드시 컴포넌트가 생성되기 전에 호출이 되어야하고, 그렇지 않다면 @Nullable을 붙여야 합니다. 이 경우 컴포넌트는 null 인자를 호출한것 처럼 동작하게 됩니다. 당연히 원시타입은 null이 될수 없으므로 @Nullable을 붙이면 안됩니다.

@BindsInstance를 통해 바인딩된 인스턴스는 Module내에서 제공되는 인스턴스와 동일하게 동작됩니다. 

카테고리: Dagger2Java

0개의 댓글

답글 남기기

Avatar placeholder

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.